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

JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): ํžˆ์Šคํ† ๊ทธ๋žจ ์ฒ˜๋ฆฌ, ๊ณฑํ•˜๊ธฐ, ์นดํˆฐํšจ๊ณผ

by HanaV 2023. 4. 13.
728x90

1. ํžˆ์Šคํ† ๊ทธ๋žจ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๊ณ ๋Œ€๋น„ ์ฒ˜๋ฆฌ

๊ธฐ์กด ๊ณ ๋Œ€๋น„ ํšจ๊ณผ๋Š” 0๊ณผ 255์˜ ํ‰๊ท ์ธ 127.5 ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ณด๋‹ค ํฌ๋ฉด 255, ์ž‘์œผ๋ฉด 0์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค.
ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์‚ฌ์ง„์ด ์ด๋ฏธ ๋ฐ์€ ํŽธ์ด์–ด์„œ ๋ชจ๋‘ 128 ์ด์ƒ์ด๋ผ๋ฉด? ์•„๋‹ˆ๋ฉด ๋ชจ๋‘ 127 ์ดํ•˜๋ผ๋ฉด?
์›๋ณธ ์ด๋ฏธ์ง€์—๋Š” ๋ถ„๋ช… ๋ช…๋„ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ, ์ด ํšจ๊ณผ๋ฅผ ์ ์šฉํ•˜๋ฉด ์ „๋ถ€ ๊ฐ™์€ ํฐ์ƒ‰์ด๋‚˜ ๊ฒ€์€์ƒ‰์œผ๋กœ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„๋„ ๋ฐฐ๊ฒฝ๊ณผ ํ„ธ์ด ๋ชจ๋‘ 255๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์„œ ๋ฐฐ๊ฒฝ๊ณผ ์ฐจ์ด๊ฐ€ ์—†์–ด์กŒ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํžˆ 127.5๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก์ง€ ์•Š๊ณ , ์ „์ฒด ํ”ฝ์…€๋“ค์˜ ๋ถ„ํฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํžˆ์Šคํ† ๊ทธ๋žจ ์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.
๋‹ค์Œ์€ ์ „์ฒด ํ”ฝ์…€์˜ ํ‰๊ท ๊ณผ ์ค‘๊ฐ„๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์˜์ƒ์ฒ˜๋ฆฌ์ด๋‹ค.

            function blackWhite2() {
                out(inH, inW);
                var avgValue, sum =0 ;
                for(var i=0; i<inH; i++) 
                    for (var k=0; k<inW; k++) 
                        sum += inImage[i][k];
                avgValue = sum / (inH*inW);

                for(var i=0; i<inH; i++) {
                    for (var k=0; k<inW; k++) {
                        if (inImage[i][k] <= avgValue)
                            outImage[i][k] = 0;
                        else
                            outImage[i][k] = 255;
                        }
                    }
                
                displayImage();
            }

ํ‰๊ท ์€ sum์— ์ „์ฒด ํ”ฝ์…€ ๊ฐ’์˜ ํ•ฉ์„ ๋‹ด์€ ๋’ค ํ‰๊ท ์„ ๊ตฌํ–ˆ๊ณ ,

			function blackWhite3() {
                out(inH, inW);
                var centerValue = 0;
                var oneAry = new Array(inH*inW);
                var index=0;
                for(var i=0; i<inH; i++) 
                    for (var k=0; k<inW; k++) 
                        oneAry[index++] = inImage[i][k];
                oneAry.sort();
                centerValue = oneAry[parseInt((inH*inW)/2)];

                for(var i=0; i<inH; i++) {
                    for (var k=0; k<inW; k++) {
                        if (inImage[i][k] <= centerValue)
                            outImage[i][k] = 0;
                        else
                            outImage[i][k] = 255;
                    }
                }
                
                displayImage();
            }

์ค‘๊ฐ„๊ฐ’์€ ์ „์ฒด ํ”ฝ์…€์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋‹ด์€ ๋’ค sort()ํ•จ์ˆ˜๋กœ ์ •๋ ฌํ•˜์—ฌ ์ค‘๊ฐ„๊ฐ’์„ ์ฐพ์•„๋‚ด์—ˆ๋‹ค.

ํ‰๊ท ๊ฐ’
์ค‘๊ฐ„๊ฐ’

ํ™•์‹คํžˆ 127.5๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋˜ ์˜์ƒ์ฒ˜๋ฆฌ๋ณด๋‹ค ์‚ฌ์ง„์˜ ๋ช…๋„ ๊ตฌ๋ถ„์ด ์‚ฌ์ง„์— ๋งž๊ฒŒ ๋ช…ํ™•ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

2. ํžˆ์Šคํ† ๊ทธ๋žจ ๋ช…์•”๋Œ€๋น„ ์ŠคํŠธ๋ ˆ์นญ

์ด๋ฏธ์ง€ ๋‚ด์—์„œ ๋ช…์•” ์ฐจ์ด๊ฐ€ ๋ณ„๋กœ ์—†์œผ๋ฉด ๊ฒฝ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ฆผ์ด ํ๋ฆฌ๊ฒŒ ํ‘œํ˜„๋œ๋‹ค. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ๋ช…์•” ๋ถ„ํฌ๋ฅผ ๊ณ ๋ คํ•ด์„œ ์ŠคํŠธ๋ ˆ์นญ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

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

                //๊ณต์‹: out = (in - low)/(high - low)*255.0
                var low = inImage[0][0], high = inImage[0][0]; 
                    //high low๋ฅผ ๊ตฌํ•  ๋•Œ ์ดˆ๊ธฐ๊ฐ’์„ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ’์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๋‹ค

                for(var i=0; i<outH; i++) {
                    for (var k=0; k<outW; k++) {
                        if (inImage[i][k] < low)
                            low = inImage[i][k];
                        if (inImage[i][k] > high)
                            high = inImage[i][k];
                    }
                }

                for(var i=0; i<outH; i++) {
                    for (var k=0; k<outW; k++) {
                        outImage[i][k] = parseInt((inImage[i][k]-low)/(high-low)*255.0);
                    }
                }
                displayImage();
            }

 

3. ์—”๋“œ- ์ธ ํƒ์ƒ‰

high๊ฐ’์ด ์ด๋ฏธ 255์ด๊ฑฐ๋‚˜ 255์— ๊ฐ€๊น๊ณ , low๊ฐ’์ด ์ด๋ฏธ 0์ด๊ฑฐ๋‚˜ 0์— ๊ฐ€๊นŒ์šด ๊ฒฝ์šฐ, ์ŠคํŠธ๋ ˆ์นญ์„ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ณต๊ฐ„์€ 0~255๊นŒ์ง€ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋‹ˆ ์ŠคํŠธ๋ ˆ์นญ์„ ํ•  ๊ณต๊ฐ„์ด ์—†๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿผ์—๋„ ์ข€ ๋” ์„ ๋ช…ํ•œ ๋ช…๋„๋Œ€๋น„๋ฅผ ์›ํ•œ๋‹ค๋ฉด, high๊ฐ’์„ ๊ฐ•์ œ๋กœ ๋‚ฎ์ถ”๊ณ  low ๊ฐ’์„ ๊ฐ•์ œ๋กœ ๋†’ํ˜€์„œ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ  ์ŠคํŠธ๋ ˆ์นญ์„ ํ•˜๋ฉด ๋”์šฑ ์„ ๋ช…ํ•œ ๋ช…๋„ ๋Œ€๋น„๋ฅผ ๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

                 //๊ณต์‹: out = (in - low)/(high - low)*255.0
                 var low = inImage[0][0], high = inImage[0][0]; 
                    //high low๋ฅผ ๊ตฌํ•  ๋•Œ ์ดˆ๊ธฐ๊ฐ’์„ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ’์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๋‹ค

                for(var i=0; i<outH; i++) {
                    for (var k=0; k<outW; k++) {
                        if (inImage[i][k] < low)
                            low = inImage[i][k];
                        if (inImage[i][k] > high)
                            high = inImage[i][k];
                    }
                }
                high -=50;
                low += 50;

                for(var i=0; i<outH; i++) {
                    for (var k=0; k<outW; k++) {
                        outImage[i][k] = parseInt((inImage[i][k]-low)/(high-low)*255.0);
                    }
                }
                displayImage();
            }

์ด๋ฏธ high low๊ฐ€ ๊ฐ๊ฐ 255, 0์— ๊ฐ€๊นŒ์›Œ์„œ ํžˆ์Šคํ† ๊ทธ๋žจ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋„ ์ž˜ ์ ์šฉ์ด ๋˜์ง€ ์•Š๋Š” ๋ชจ์Šต์ด๋‹ค.
์—”๋“œ-์ธ ํƒ์ƒ‰์œผ๋กœ ๋ช…๋„ ๋Œ€๋น„๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ํ•œ ๋ชจ์Šต

๋‹ค๋งŒ, ์—”๋“œ์ธ์€ ๋ช…๋„๊ฐ€ ํ•œ ์ชฝ์œผ๋กœ ์น˜์šฐ์ณ์ง„ (๋„ˆ๋ฌด ์–ด๋‘ก๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๋ฐ์€) ์ด๋ฏธ์ง€๋Š” ์ ์šฉํ•˜๊ธฐ ์œ„ํ—˜ํ•˜๋‹ค. ๋งจ ๋ 50์”ฉ์„ ์ž˜๋ผ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

 

4. ํžˆ์Šคํ† ๊ทธ๋žจ ํ‰ํ™œํ™”

์–ด๋‘ก๊ฒŒ ์ดฌ์˜๋œ ์‚ฌ์ง„์— ์ œ์ผ ์ ํ•ฉํ•œ ์˜์ƒ์ฒ˜๋ฆฌ๋กœ, ์–ด๋‘ก๊ฒŒ ์ดฌ์˜๋œ ์˜์ƒ์˜ ๋ฐ๊ธฐ ๋ถ„ํฌ๋ฅผ ์žฌ๋ถ„๋ฐฐํ•ด์„œ ๋ช…์•” ๋Œ€๋น„๋ฅผ ์ตœ๋Œ€๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

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

                //1๋‹จ๊ณ„: ํžˆ์Šคํ† ๊ทธ๋žจ ์ƒ์„ฑ
                var histo = new Array(256);
                for (var i=0; i<256; i++) // ์ดˆ๊ธฐํ™”
                    histo[i] = 0;

                for(var i=0; i<inH; i++) 
                    for (var k=0; k<inW; k++) 
                        histo[inImage[i][k]]++;
                //2๋‹จ๊ณ„: ๋ˆ„์  ํžˆ์Šคํ† ๊ทธ๋žจ
                var sumHisto = new Array(256);
                for (var i=0; i<256; i++) // ์ดˆ๊ธฐํ™”
                    sumHisto[i] = 0;
                var sumValue = 0;
                for (var i=0; i<256; i++) {
                    sumValue += histo[i];
                    sumHisto[i] = sumValue;
                }
                
                //3๋‹จ๊ณ„: ์ •๊ทœํ™”๋œ ๋ˆ„์  ํ•ฉ๊ณ„
                var n = new Array(256);
                for (var i=0; i<256; i++) // ์ดˆ๊ธฐํ™”
                    n[i] = 0.0;
                for (var i=0; i<256; i++)
                    n[i] = sumHisto[i] * (1.0/(inH*inW) * 255.0);
                

                //์ตœ์ข…
                for(var i=0; i<inH; i++) {
                    for (var k=0; k<inW; k++) {
                        outImage[i][k] =  parseInt(n[inImage[i][k]]);
                    }
                }
                displayImage();
            }

 

5. ๊ณฑํ•˜๊ธฐ

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

            function multipyImage() {
                out(inH, inW);
                var value = prompt("๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”(์–‘์ˆ˜)", "2");

                for(var i=0; i<inH; i++) {
                    for (var k=0; k<inW; k++) {
                        outImage[i][k] = inImage[i][k] * value;
                    }
                }
                displayImage();
            }

1.5๋ฅผ ๊ณฑํ–ˆ์„ ๋•Œ

 

6. ์นดํˆฐ ํšจ๊ณผ

๋ช…๋„๊ฐ€ ๋ณ€ํ•  ๋•Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด์–ด์ง€์ง€ ์•Š๊ณ  ๊ฒฝ๊ณ„๊ฐ€ ์ง€๋ฉด์„œ ๋ฏธ๊ตญ ์นดํˆฐ ๋Š๋‚Œ์ด ๋‚˜๋„๋ก ๋ณด์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 
0~255๊นŒ์ง€ ๋ฒ”์œ„๋ฅผ ์ •ํ•ด ์ผ์ • ๋ฒ”์œ„๋Š” ๊ฐ™์€ ํ”ฝ์…€๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

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

                for (i=0; i<outH; i++) {
                    for (k=0; k<outW; k++) {
                        if (inImage[i][k]>200)
                            outImage[i][k] = 225;
                        else if (inImage[i][k]>175)
                            outImage[i][k] = 200;
                        else if (inImage[i][k]>150)
                            outImage[i][k] = 175;
                        else if (inImage[i][k]>125)
                            outImage[i][k] = 150;
                        else if (inImage[i][k]>100)
                            outImage[i][k] = 125;
                        else if (inImage[i][k]>75)
                            outImage[i][k] = 100;
                        else if (inImage[i][k]>50)
                            outImage[i][k] = 75;
                        else if (inImage[i][k]>25)
                            outImage[i][k] = 50;
                        else if (inImage[i][k] = 0)
                            outImage[i][k] = 0
                        else outImage[i][k] = 25;
                        }
                    }
                
                displayImage();
            }

๊ธฐ์—ฌ์›ก

 

728x90

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

JavaScript๋กœ ์˜์ƒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ๋งŒ๋“ค๊ธฐ (Beta ver.): ๋ธ”๋Ÿฌ ํšจ๊ณผ ์กฐ์ ˆํ•˜๊ธฐ + ๊ฒฝ๊ณ„๊ฐ’ ์ฒ˜๋ฆฌํ•˜๊ธฐ  (0) 2023.04.14
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

"); wcs_do();