๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ/Frontend

JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): ๋งˆ์Šคํฌ ์‚ฌ์šฉํ•ด์„œ ์— ๋ณด์‹ฑ, ๋ธ”๋Ÿฌ, ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ, ๋ชจ์…˜๋ธ”๋Ÿฌ, ์ƒคํ”„๋‹, ์—ฃ์ง€

by HanaV 2023. 4. 13.
728x90

ํ™”์†Œ ์˜์—ญ ์ฒ˜๋ฆฌ๋ž€, ํ”ฝ์…€์ด ์ฃผ๋ณ€์˜ ํ”ฝ์…€๊ฐ’์— ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
์ด ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฃผ๋ณ€ ํ”ฝ์…€์— ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ, ์ด ๋–„ ๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋งˆ์Šคํฌ๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•˜๋Š” ๋ฒ•

1. ๋จผ์ € ๋งˆ์Šคํฌ๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ 3by3 ํ–‰๋ ฌ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ์•„๋ž˜๋Š” ์— ๋ณด์‹ฑ ๋งˆ์Šคํฌ์ด๋‹ค.

		var mask = [    [ -1.0 ,  0.0 ,  0.0 ], 
                                [  0.0 ,  0.0 ,  0.0 ], 
                                [  0.0 ,  0.0 ,  1.0 ]  ];

2. ๊ทธ๋ฆฌ๊ณ  ์ž„์‹œ๋กœ ์ž…๋ ฅ๋ฐฐ์—ด๊ณผ ์ถœ๋ ฅ๋ฐฐ์—ด์„ ๋‹ด์„ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค€๋‹ค. ์ด ๋•Œ ์ž„์‹œ ์ž…๋ ฅ ๋ฐฐ์—ด ํฌ๊ธฐ๋Š” ๋งˆ์Šคํฌ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•ด์„œ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, ์ด ์˜ˆ์‹œ์—์„œ๋Š” 3by3 ํ–‰๋ ฌ์ด๋ฏ€๋กœ +2๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.
์ถœ๋ ฅ๋ฐฐ์—ด์€ ์ตœ์ข… ์ถœ๋ ฅ ์ด๋ฏธ์ง€์— ํ•„์š”ํ•œ ๊ฐ’๋งŒ ๋‹ด์œผ๋ฉด ๋˜๋ฏ€๋กœ outHeight์™€ outWidth์™€ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋” ๋†’์€ ์™„์„ฑ๋„๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ž„์‹œ ์ž…๋ ฅ ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ์ž๋ฆฌ ๊ฐ’๋„ ๋น„์Šทํ•˜๊ฒŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ์ผ๋‹จ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋นˆ ๊ณต๊ฐ„์€ 127๋กœ ์ฑ„์šฐ๋„๋ก ํ•œ๋‹ค.

                var tmpInImage = new Array(inH+2);
                for(var i=0; i<inH+2; i++)
                    tmpInImage[i] = new Array(inW+2).fill(127.0);

                for(var i=0; i<inH; i++) 
                    for (var k=0; k<inW; k++) 
                        tmpInImage[i+1][k+1] = inImage[i][k];

3. ๋งŒ๋“ค์–ด์ง„ ์ž„์‹œ ์ž…๋ ฅ๋ฐฐ์—ด ์ค‘์•™์— inImage๋ฅผ ์œ„์น˜ํ•ด ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

                for(var i=0; i<inH; i++) 
                    for (var k=0; k<inW; k++) 
                        tmpInImage[i+1][k+1] = inImage[i][k];

4. ์ด์ œ ๋งˆ์Šคํฌ์™€ ํ”ฝ์…€์„ ๊ณฑํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ, ํ•˜๋‚˜์˜ ํ”ฝ์…€์— ๋งˆ์Šคํฌ๋ฅผ ๊ณฑํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ ์•ˆ์— ๋งˆ์Šคํฌ์˜ ํฌ๊ธฐ๋งŒํผ ๋˜ ๋ฐ˜๋ณตํ•˜๋Š” for๋ฌธ์„ ๋„ฃ์–ด์ค€๋‹ค. ์ด๋•Œ์˜ ๊ฐ’์€ ์ž„์‹œ ์ถœ๋ ฅ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

                for(var i=0; i<inH; i++) {
                    for (var k=0; k<inW; k++) {
                        var S = 0.0;
                        for(var m=0; m<3; m++) 
                            for (var n=0; n<3; n++) 
                                S += tmpInImage[i+m][k+n] * mask[m][n];
                        
                        tmpOutImage[i][k] = S;
                    }
                }

5. ๋งˆ์Šคํฌ value์˜ ํ•ฉ์ด 0์ผ ๊ฒฝ์šฐ, ๋Œ€๋ถ€๋ถ„ 127์„ ๋”ํ•ด ํ›„์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.

                for (var i=0; i<outH; i++)
                    for (var k=0; k<outW; k++)
                        tmpOutImage[i][k] += 127.0;

6. ์ž„์‹œ ์ถœ๋ ฅ ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฒƒ์„ ์ถœ๋ ฅ ๋ฐฐ์—ด์— ์˜ฎ๊ฒจ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค.

                for (var i=0; i<outH; i++)
                    for (var k=0; k<outW; k++)
                        outImage[i][k] = parseInt(tmpOutImage[i][k]);

                displayImage();

ํ™”์†Œ ์˜์—ญ ์ฒ˜๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งˆ์Šคํฌ์˜ ๊ฐ’๋งŒ ๋ณ€ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋งˆ์Šคํฌ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ์ž˜ ์ดํ•ดํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ๋งˆ์Šคํฌ๋ฅผ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

1. ์— ๋ณด์‹ฑ

์— ๋ณด์‹ฑ์€ ์ž…๋ ฅ ์–‘์ƒ์„ ์–‘๊ฐ ํ˜•ํƒœ๋กœ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

           function embos() {
                out(inH, inW);

                var mask = [    [ -1.0 ,  0.0 ,  0.0 ], 
                                [  0.0 ,  0.0 ,  0.0 ], 
                                [  0.0 ,  0.0 ,  1.0 ]  ];

                var tmpInImage = new Array(inH+2);
                for(var i=0; i<inH+2; i++)
                    tmpInImage[i] = new Array(inW+2).fill(127.0);

                for(var i=0; i<inH; i++) 
                    for (var k=0; k<inW; k++) 
                        tmpInImage[i+1][k+1] = inImage[i][k];

                var tmpOutImage = new Array(outH);
                for(var i=0; i<outH; i++)
                    tmpOutImage[i] = new Array(outW);
 
                for(var i=0; i<inH; i++) {
                    for (var k=0; k<inW; k++) {
                        var S = 0.0;
                        for(var m=0; m<3; m++) 
                            for (var n=0; n<3; n++) 
                                S += tmpInImage[i+m][k+n] * mask[m][n];
                        
                        tmpOutImage[i][k] = S;
                    }
                }

                for (var i=0; i<outH; i++)
                    for (var k=0; k<outW; k++)
                        tmpOutImage[i][k] += 127.0;

                for (var i=0; i<outH; i++)
                    for (var k=0; k<outW; k++)
                        outImage[i][k] = parseInt(tmpOutImage[i][k]);

                displayImage();
            }

 

2. ๊ธฐ๋ณธ ๋ธ”๋Ÿฌ

๊ธฐ๋ณธ ๋ธ”๋Ÿฌ๋Š” ์ฃผ๋ณ€ ํ”ฝ์…€์— ๋™์ผํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ์ค˜์„œ ์˜์—ญ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ์ฝ”๋“œ์—์„œ ๋ณด์ด๋“ฏ์ด 9๊ฐœ์˜ ํ”ฝ์…€์— 1/9์”ฉ ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ์—ˆ๋‹ค.๋งˆ์Šคํฌ์˜ ํ•ฉ์ด 1์ด๋ฏ€๋กœ(๋งˆ์Šคํฌ์˜ ํ•ฉ์€ ๋ฌด์กฐ๊ฑด 0์•„๋‹ˆ๋ฉด 1์ด๋‹ค) ํ›„์ฒ˜๋ฆฌ๋Š” ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

           function blur() {

                outH = inH;
                outW = inW;

                outImage = new Array(outH);
                for(var i=0; i<outH; i++)
                    outImage[i] = new Array(outW);

                var mask = [    [ 1/9. ,  1/9.,  1/9. ], 
                                [  1/9. ,  1/9. , 1/9. ], 
                                [  1/9. ,  1/9. ,  1/9. ]  ];

                var tmpInImage = new Array(inH+2);
                for(var i=0; i<inH+2; i++)
                    tmpInImage[i] = new Array(inW+2).fill(127.0);
     
                for(var i=0; i<inH+2; i++) 
                    for (var k=0; k<inW+2; k++) 
                        tmpInImage[i][k] = 127.0;

                for(var i=0; i<inH; i++) 
                    for (var k=0; k<inW; k++) 
                        tmpInImage[i+1][k+1] = inImage[i][k];
                        
                var tmpOutImage = new Array(outH);
                for(var i=0; i<outH; i++)
                    tmpOutImage[i] = new Array(outW);

                for(var i=0; i<inH; i++) {
                    for (var k=0; k<inW; k++) {
                        var S = 0.0;
                        for(var m=0; m<3; m++) 
                            for (var n=0; n<3; n++) 
                                S += tmpInImage[i+m][k+n] * mask[m][n];
                        
                        tmpOutImage[i][k] = S;
                    }
                }

                for (var i=0; i<outH; i++)
                    for (var k=0; k<outW; k++)
                        outImage[i][k] = parseInt(tmpOutImage[i][k]);

                displayImage();
            }

3by3 ํ–‰๋ ฌ ์ฆ‰, ํ”ฝ์…€์˜ ๋ฐ”๋กœ ์˜† ํ”ฝ์…€๋“ค๋งŒ ์˜์—ญ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธ”๋Ÿฌ ์ •๋„๊ฐ€ ์•ฝํ•˜๋‹ค. ๋งŒ์•ฝ ๋งˆ์Šคํฌ์˜ ํ–‰๋ ฌ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ํ•œ๋‹ค๋ฉด ๋” ๊ฐ•ํ•œ ๋ธ”๋Ÿฌํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

3. ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ

๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋Š” ๋ชจ๋‘ ๋™์ผํ•œ ๊ฐ€์ค‘์น˜๊ฐ€ ์•„๋‹Œ, ์ค‘์•™(์›์‹œํ”ฝ์…€)์— ๊ฐ€์žฅ ํฐ ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ๊ณ  ๋ฉ€์–ด์งˆ์ˆ˜๋ก ์ ์  ์ž‘์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•ด์ค€๋‹ค. ๊ธฐ๋ณธ ๋ธ”๋Ÿฌ์—์„œ ๋งˆ์Šคํฌ์˜ ๊ฐ’๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

                var mask = [    [ 1/16. ,  1/8.,  1/16. ], 
                                [  1/8. ,  1/4. , 1/8. ], 
                                [  1/16. ,  1/8. ,  1/16. ]  ];

 

4. ๋ชจ์…˜ ๋ธ”๋Ÿฌ

๋ชจ์…˜๋ธ”๋Ÿฌ๋Š” ํ”๋“ค๋ฆฌ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 
๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ชจ์…˜๋ธ”๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ๋งŒ์•ฝ ์ˆ˜์ง ๋ฐฉํ–ฅ์„ ์›ํ•œ๋‹ค๋ฉด ๋งˆ์Šคํฌ์˜ [0,1][1,1][2,1]์˜ ๊ฐ’์— ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ๊ณ  ๋‚˜๋จธ์ง€๋Š” 0์„ ํ•˜๋ฉด ๋œ๋‹ค.

                var mask = [    [ 0. ,  0.,  0. ], 
                                [  1/3. ,  1/3. , 1/3. ], 
                                [  0. ,  0. ,  0. ]  ];

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งˆ์Šคํฌ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋ฉด ๋” ํฐ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค

 

5. ์ƒคํ”„๋‹

๋ธ”๋Ÿฌ๋ง๊ณผ ๋ฐ˜๋Œ€๋˜๋Š” ํšจ๊ณผ๋ฅผ ๋ณด์ด๋Š” ๊ธฐ๋ฒ•์œผ๋กœ, ์ƒ์„ธํ•œ ๋ถ€๋ถ„์„ ๋”์šฑ ๊ฐ•์กฐํ•˜์—ฌ ๋Œ€๋น„ํšจ๊ณผ๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. 

            function sharpen() {

                outH = inH;
                outW = inW;

                outImage = new Array(outH);
                for(var i=0; i<outH; i++)
                    outImage[i] = new Array(outW);

                var mask = [    [ 0. ,  -1.,  0. ], 
                                [  -1. ,  5. , -1. ], 
                                [  0. ,  -1. ,  0. ]  ];

                var tmpInImage = new Array(inH+2);
                for(var i=0; i<inH+2; i++)
                    tmpInImage[i] = new Array(inW+2).(127.0);
         
                for(var i=0; i<inH+2; i++) 
                    for (var k=0; k<inW+2; k++) 
                        tmpInImage[i][k] = 127.0;

                for(var i=0; i<inH; i++) 
                    for (var k=0; k<inW; k++) 
                        tmpInImage[i+1][k+1] = inImage[i][k];

                var tmpOutImage = new Array(outH);
                for(var i=0; i<outH; i++)
                    tmpOutImage[i] = new Array(outW);

                for(var i=0; i<inH; i++) {
                    for (var k=0; k<inW; k++) {
                        var S = 0.0;
                        for(var m=0; m<3; m++) 
                            for (var n=0; n<3; n++) 
                                S += tmpInImage[i+m][k+n] * mask[m][n];
                        
                        tmpOutImage[i][k] = S;
                    }
                }

                for (var i=0; i<outH; i++)
                    for (var k=0; k<outW; k++)

                        if (tmpOutImage[i][k]> 255.0) tmpOutImage[i][k] = 255.0;
                        else if (tmpOutImage[i][k]<0) tmpOutImage[i][k] = 0.0;
                        else outImage[i][k] = parseInt(tmpOutImage[i][k]);

                displayImage();
            }

[0 -1 0][-1 5 -1][0 -1 0] ๋งˆ์Šคํฌ๋กœ ์ƒคํ”„๋‹์„ ํ•œ ๊ฒฐ๊ณผ
[-1 -1 -1][-1 9 -1][-1 -1 -1] ๋งˆ์Šคํฌ๋กœ ์ƒคํ”„๋‹์„ ํ•œ ๊ฒฐ๊ณผ

 

6. ์œค๊ณฝ์„ (์—ฃ์ง€)

์—ฃ์ง€๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ , ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์ •ํ™•๋„์™€ ์„ ๋ช…๋„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. 

[0, 0, 0][-1, 1, 0][0, 0, 0]
[-1, -1, 0][-1, 3, 0][0, 0, 0]
์ฐจ์—ฐ์‚ฐ์ž

728x90

'๐Ÿ–ฅ๏ธ > Frontend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): ํ™•๋Œ€ ์‹œ ํ™”์งˆ๊ฐœ์„ ์— ๋Œ€ํ•œ ์ƒ๊ฐ  (0) 2023.04.13
JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): ํžˆ์Šคํ† ๊ทธ๋žจ ์ฒ˜๋ฆฌ, ๊ณฑํ•˜๊ธฐ, ์นดํˆฐํšจ๊ณผ  (0) 2023.04.13
JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): RAW ์ด๋ฏธ์ง€ ๋ฐ๊ธฐ์กฐ์ ˆ, ์ƒ‰์ƒ ๋ณ€๊ฒฝ, ๋ฏธ๋Ÿฌ๋ง, ํšŒ์ „, ํ™•๋Œ€/์ถ•์†Œ, ๋ธ”๋Ÿฌํšจ๊ณผ  (0) 2023.04.12
JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): RAW ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ  (0) 2023.04.12
JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Alpha ver.) : ์ด๋ฏธ์ง€ ๋ฐ๊ธฐ์กฐ์ ˆ, ์ƒ‰์ƒ ๋ณ€๊ฒฝ, ๋ฏธ๋Ÿฌ๋ง, ํšŒ์ „, ํ™•๋Œ€/์ถ•์†Œ, ๋‹ค์ด์•„๋ชฌ๋“œ๋กœ ๋งŒ๋“ค๊ธฐ  (0) 2023.04.11

"); wcs_do();