ํ๋ก์ ํธ ๋ช : OpenCV ์์ด JavaScript๋ก ๊ตฌํํ๋ ์์์ฒ๋ฆฌ ์ํํธ์จ์ด
์์์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ์ ๋๋ถ๋ถ ์คํ์์ค๋ก ๊ณต๊ฐ๋์ด ์๋ OpenCV๋ฅผ ์ฌ์ฉํ๋ค. OpenCV๋ Open Source Computer Vision์ ์ฝ์๋ก ๋ค์ํ ์์/๋์์ ์ฒ๋ฆฌ์ ์ฌ์ฉํ ์ ์๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ธํ ์ด ์ปดํจํฐ ๋น์ ๊ณผ ์ธ๊ณต์ง๋ฅ์ ๋ฐ๋ฌ์ํค๊ณ ์ ํ๋ ๋ฐ๋์ผ๋ก ์ถ์ํ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ์์๋ OpenCV๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , JavaScript, HTML5, CSS์ผ๋ก ์์์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๊ณ ์ฝ๋ํํ์ฌ ์์์ฒ๋ฆฌ ์ํํธ์จ์ด๋ฅผ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํ๋ค.
๋จผ์ ์ต์ข ์์ฑ๋ ์์์ฒ๋ฆฌ ์ํํธ์จ์ด ์์ฐ ์์์ด๋ค.
Step 1: ๊ฐ๋จํ ๋์ ๋ฐฐ์ด๋ก ์์์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ์ดํดํ๊ณ ์ ์ฉํด๋ณด๊ธฐ
์์์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ก ์ด๋ฏธ์ง ํ์ผ์ ์ ์ฉ์ํค๊ธฐ ์ ์, ๋จ์ํ ๋์ ๋ฐฐ์ด์ ์์์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ๋ณด๊ธฐ๋ก ํ๋ค. ๋จ์ํ ๋ฐฐ์ด๋ก ํํ์ ํด๋ณด๋ ์ดํดํ๊ธฐ๋ ํจ์ฌ ์ฌ์ ๊ณ , ์ฝ๋๋ฅผ ์ง๋ณด๋ ๊ฒ๋ ์๊ณ ๋ฆฌ์ฆ๋ง ์ดํดํ๋ฉด ์ด๋ ต์ง ์์๋ค.
๋์ ๋ฐฐ์ด์ ์ ์ฉ์ํจ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ ๋จ๊ณ์์๋ ๋๊ฐ์ด ๋ฐ๋ณต๋๋ฏ๋ก, ์์ธํ ๋ณด๊ณ ์ถ์ผ๋ฉด ๋ฐ์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
๋์ ๋ฐฐ์ด์ ์์์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉํ๊ธฐ: https://hanav.tistory.com/130
JavaScript๋ก ์์์ฒ๋ฆฌ ์ํํธ์จ์ด ๋ง๋ค๊ธฐ (Alpha ver.) : ์ด๋ฏธ์ง ๋ฐ๊ธฐ์กฐ์ , ์์ ๋ณ๊ฒฝ, ๋ฏธ๋ฌ๋ง, ํ์ ,
*์๊ณ ๋ฆฌ์ฆ ์ฐ์ต์ฉ์ผ๋ก rgb๋ฅผ ์์์ ์ซ์(math.random()*256)๋ก ๋์ฒดํจ. *์ ์ฌ๊ฐํ์ธ GrayScale์ด๋ฏธ์ง๋ผ ๊ฐ์ ํจ. 1. ์ด๋ฏธ์ง ์๋ณธ ๊ทธ๋๋ก //ํจ์ ์ ์ธ๋ถ function display(image, height, width) { for(var i=0; i
hanav.tistory.com
Step2: RAW ์ด๋ฏธ์ง ํ์ผ์ ์์์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉํด๋ณด๊ธฐ
์์์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๊ณ ์ ์ฉ์์ผ๋ดค๋ค๋ฉด, ์ค์ RAW ์ด๋ฏธ์ง ํ์ผ์ ์ ์ฉ์ ์์ผ๋ณผ ์ฐจ๋ก์ด๋ค. RAW ์ด๋ฏธ์ง๋ ๋ง ๊ทธ๋๋ก ๋ ๊ฒ์, ๊ฐ๊ณต๋์ง ์์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ด๋ค. JPEG, PNG ๋ฑ์ ์ด๋ฏธ ๊ฐ๊ณต๋์ด ์์ถ๋์ด ์๋ ํํ๋ผ ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ง๋ง, RAW ์ด๋ฏธ์ง ํ์ผ์ ๋น์ ์ ๊ธฐ์ ํธ๋ก ๊ธฐ๋กํ ์์ํ ๋ฐ์ดํฐ ์์ฒด์ด๋ฏ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋์ ๋ฐฐ์ด์ด ์๋ ์ด๋ฏธ์ง ํ์ผ์ ์ ์ฉํ ๋๋ ๊ณ ๋ คํด์ผํ ์ ์ด ์๋ค.
๋จผ์ ์ด๋ฏธ์ง ํ์ผ์ RGB๊ฐ๊ณผ Alpha ๊ฐ์ด ๋ฌถ์ฌ์ ํ๋์ ํฝ์
๋ก ๋ํ๋๋ค๋ ์ ์ด๋ค. ๋์ ๋ฐฐ์ด์์๋ ํ๋์ ํฝ์
์ด ํ๋์ ์ซ์์๋ค๋ฉด, ์ด๋ฏธ์ง ํ์ผ์์๋ (r, g, b, alpha) ๊ฐ ํ๋์ ํฝ์
์ด ๋๋ค. ์ฌ๊ธฐ์ ๋ง์ฝ ์นผ๋ผ ์ฌ์ง์ ์ ์ฉ์ํจ๋ค๋ฉด RGB๊ฐ์ด ๋ชจ๋ ๋ฌ๋ผ ์ผ์ฐจ์ ๋ฐฐ์ด์ ์ค์ ํด์ผ ํ๊ฒ ์ง๋ง, ์ด๋ฒ ํ๋ก์ ํธ์์๋ ๊ฐ๋จํ๊ฒ GrayScale ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. GrayScale ์ด๋ฏธ์ง๋ R=G=B (Alpha ๊ฐ๋ 255, ํฌ๋ช
๋๊ฐ ์๋ ์ด๋ฏธ์ง ํ์ผ์ ์ฌ์ฉ)์ด๋ฏ๋ก ์ด์ฐจ์ ๋ฐฐ์ด๋ง ์์ด๋ ๊ตฌํํ ์ ์๋ค.
๋ํ, HTML5 ์บ๋ฒ์ค๋ ์ ๊ณผ ๋ฉด์ ํํ ๊ฐ๋ฅํ์ง๋ง ์ ์ ํํํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ํฝ์
๊ฐ ํ๋ํ๋๋ฅผ ๋ถ๋ฌ์ ๋ชจ์ฌ ์๋ ์ด๋ฏธ์ง๋ฅผ ํํํ ์ ์๋๋ฐ, ์ด๋ ํฝ์
๊ฐ์ ๋ชจ์์ ์์์ ์ข
์ด์ ๋จผ์ ๋ถ์ด๊ณ , ์ข
์ด๋ฅผ ์บ๋ฒ์ค์ ๋ถ์ด๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๊ธฐ๋ก ํ๋ค.
์ ์ฉํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์๋ ๋ค์ ๋จ๊ณ์ ๋ชจ์์ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค.
JavaScript๋ก ์์์ฒ๋ฆฌ ์ํํธ์จ์ด ๋ง๋ค๊ธฐ (Beta ver.): RAW ์ด๋ฏธ์ง ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
Alpha ๋ฒ์ ์์๋ ๋์๋ก ํ๋ค๋ฉด, ์ด๋ฒ์๋ ํ ๋จ๊ณ๋ฅผ ์ ํด์ ์ง์ง ์ด๋ฏธ์ง์ ์์์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด๋ณด๊ณ ์ ํ๋ค. ์ผ๋ฐ ํ์ผ(BMP, JPG, PNG, TIF, GIF ๋ฑ)์ ์ด๋ฏธ์ง์ฒ๋ฆฌํ๊ธฐ ๋ง์ด ์ด๋ ค์ด๋ฐ, RAW ์ด๋ฏธ
hanav.tistory.com
Step3: ์์์ฒ๋ฆฌ ์ฌํ ์๊ณ ๋ฆฌ์ฆ ํ์ตํ๊ณ ์ ์ฉํด๋ณด๊ธฐ
1) ํ์ ์ ์ฒ๋ฆฌ
ํ์ ์ ์ฒ๋ฆฌ๋, ์ฃผ๋ณ ํ์ ๊ฐ์ ์๊ด์์ด ๋จ์ํ ๊ทธ ๊ฐ๋ง ๋ณํ๋ ๊ฒ์ ๋งํ๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ฐํ ์ ์๋ ๊ฒ์ ๋ํ๊ธฐ, ๋นผ๊ธฐ, ๊ณฑํ๊ธฐ, ๋๋๊ธฐ์ ์ฐ์ ์ฐ์ฐ์ ์ ์ฉํ๋ ๊ฒ์ด๋ค. ํฝ์ ์ ๊ฐ์ด ์ปค์ง์๋ก ๋ช ๋๊ฐ ๋์์ง๋ค๋ ๊ฒ์ ๊ณ ๋ คํ๋ฉด, ์ฐ์ ์ฐ์ฐ์ ์ ์ฉํ์ ๋ ๋ค์๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
-๋ํ๊ธฐ = ๋ฐ๊ฒ ํ๊ธฐ
-๋นผ๊ธฐ = ์ด๋ก๊ฒ ํ๊ธฐ
-๊ณฑํ๊ธฐ = ๋ฐ๊ฒํ๋๋ฐ ๋ฐ์ ๊ณณ์ ๋ ๋ฐ์์ง๊ณ , ์ด๋์ด ๊ณณ์ ๋ ๋ฐ์์ง๊ฒ ํ๊ธฐ
-๋๋๊ธฐ = ์ด๋ก๊ฒ ํ๋๋ฐ ์ด๋์ด ๊ณณ์ ๋ ์ด๋์์ง๊ณ , ๋ฐ์ ๊ณณ์ ๋ ์ด๋ก๊ฒ ํ๊ธฐ
๋ํ๊ธฐ์ ๋นผ๊ธฐ, ๊ณฑํ๊ธฐ์ ๋๋๊ธฐ๋ ๊ฒฐ๊ตญ ๊ฐ์ผ๋ฏ๋ก ๊ฐ์ด ์กฐ์ ํ ์ ์๊ฒ ์ค์ ํ์๋ค. ๊ทธ๋ฆฌ๊ณ 0๋ถํฐ 255๊น์ง์ ๊ฐ๋ง ๊ฐ๋ฅํ๋ฏ๋ก, 0์ด๋ 255๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ๊ฐ 0๊ณผ 255๋ก ๋ฐ๋๋ก ์ ํ์กฐ๊ฑด๋ ์ค์ ํด์ฃผ์๋ค.
if (inImage[i][k] + value < 0 )
outImage[i][k] = 0;
else if (inImage[i][k] + value > 255 )
outImage[i][k] = 255;
else
outImage[i][k] = inImage[i][k]+value;
outImage[i][k] = inImage[i][k] * value;
๋ํ, ์์์ ๋ฐ์ ์ํค๋ ๊ฒ๋ ์ต๋ ๋ช
๋๊ฐ์ธ 255์์ ์ด์ ํฝ์
๊ฐ์ ๋นผ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ํํ ๊ฐ๋ฅํ๋ค.
outImage[i][k] = 255 - inImage[i][k];
๋ช
๋๊ฐ ๋ณํ ๋ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง์ง ์๊ณ ๊ฒฝ๊ณ๊ฐ ์ง๋ฉด์ ๋ฏธ๊ตญ ์นดํฐ ๋๋์ด ๋๋๋ก ๋ณด์ ํ ์๋ ์๋ค.
0~255๊น์ง ๋ฒ์๋ฅผ ์ ํด ์ผ์ ๋ฒ์๋ ๊ฐ์ ํฝ์
๊ฐ์ผ๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
2) ํ์คํ ๊ทธ๋จ ์ฒ๋ฆฌ
ํ์คํ ๊ทธ๋จ์ด๋ ์ฐ๋ฆฌ๊ฐ ํํ ๋ณด๋ ๋ง๋๊ทธ๋ํ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. (๋ง๋๊ทธ๋ํ์์ ์ฐจ์ด์ ์ด๋ผ๋ฉด, ํ์คํ ๊ทธ๋จ์ ์ฐ์์ ์ธ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋์ด์ ๋ง๋ ์ฌ์ด์ ๋น์นธ์ด ์๋ค๋ ์ ์ด๋ค) ๊ฐ๋ก์ถ์๋ ๋ช ๋, ์ธ๋ก์ถ์๋ ๊ทธ ๋ช ๋๊ฐ์ ๊ฐ์ง ํ์์ ์๊ฐ ๋๋ค. ์ฆ, ์ฐ๋ฆฌ๋ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ช ๋์ ๋ถํฌ๋ฅผ ํ์ ํ ์ ์๊ณ , ์ด๋ฅผ ์ ์ฌ์ฉํ๋ฉด ๋ช ๋ ๋๋น์ ๋ณํ๋ฅผ ์ค ์ ์๋ค.
ํ์คํ ๊ทธ๋จ์ ์ด์ฉํ ์ ์๋ ์ ์ผ ๊ฐ๋จํ ์๋ ์ด๋ฏธ์ง๋ฅผ ์ค์ง 255 ๋๋ 0์ผ๋ก ๋ํ๋ด๋ ๊ณ ๋๋น ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ๋์ด๋ค. ๊ทธ๋ฅ ํธํ๊ฒ 255์ 0์ ์ค๊ฐ๊ฐ์ธ 127.5๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์๋ ์์ง๋ง, ๋ง์ฝ ์ฌ์ง ์์ฒด๊ฐ ๋ฐ์์ ๋ชจ๋ 128๋ณด๋ค ํฐ ๋ช ๋๊ฐ์ ๊ฐ๋๋ค๋ฉด ์ ์ฒด๊ฐ ํ์์์ผ๋ก ๋ ๊ฒ์ด๋ค. ์ด ๋, ํ์คํ ๊ทธ๋จ์ ํ์ฉํด์ ์ ์ฒด ์ด๋ฏธ์ง์ ๋ช ๋ ๋ถํฌ๋ฅผ ๋ฐํ์ผ๋ก ๊ธฐ์ค๊ฐ์ ์ค์ ํด์ฃผ๋ฉด ๋ ์์ ํ๊ณ ๊ณ ๋ฅด๊ฒ ๊ณ ๋๋น ํจ๊ณผ๋ฅผ ์ค ์ ์๋ค.
//127.5๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณ ๋๋น ์ฒ๋ฆฌ
if (inImage[i][k] > (0 + 255)/2) {
outImage[i][k] = 255;
} else {
outImage[i][k] = 0;
}
//ํ์คํ ๊ทธ๋จ ํ๊ท ์ ๊ธฐ์ค์ผ๋ก ๊ณ ๋๋น ์ฒ๋ฆฌ
avgValue = hapValue / (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;
}
}
//ํ์คํ ๊ทธ๋จ ์ค๊ฐ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ณ ๋๋น ์ฒ๋ฆฌ
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;
}
์ข ๋ ์ฌํ ์ด๋ก ์ผ๋ก ๋ค์ด๊ฐ์๋ฉด, ์ผ์ชฝ ์ด๋ฏธ์ง์ฒ๋ผ ํ์คํ ๊ทธ๋จ์ ๋ช ์ ๋ถํฌ๋ฅผ ๋๋ฆผ์ผ๋ก์จ ๋ฎ์ ๋ช ์๋๋น๋ฅผ ๋ณด์ด๋ ์์์ ํ์ง์ ํฅ์์ํฌ ์๋ ์๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ช ์๋๋น ์คํธ๋ ์นญ์ ๊ณต์์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ค๋ง ์ด ๋ฐฉ๋ฒ์ 0๊ณผ 255์ ๊ฐ์ด ๊ฐ๊ฐ ํ๋๋ผ๋ ์กด์ฌํ๋ฉด, ์คํธ๋ ์นญํ ๊ณต๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ํจ๊ณผ๊ฐ ์๋ค. ๊ทธ๋ผ์๋ ์ข ๋ ์ ๋ช ํ ๋ช ๋๋๋น๋ฅผ ์ํ๋ค๋ฉด, high๊ฐ์ ๊ฐ์ ๋ก ๋ฎ์ถ๊ณ low ๊ฐ์ ๊ฐ์ ๋ก ๋ํ์ ๊ณต๊ฐ์ ๋ง๋ค๊ณ ์คํธ๋ ์นญ์ ํ๋ฉด ๋์ฑ ์ ๋ช ํ ๋ช ๋ ๋๋น๋ฅผ ๋ณด์ด๊ฒ ํ ์ ์๋ค. ์ด ๊ธฐ๋ฒ์ด ๋ฐ๋ก ์๋-์ธ ํ์์ด๋ค. ์๋-์ธ ํ์์ ์ผ์ ์์ ํ์๋ฅผ ํฐ์์ด๋ ๊ฒ์ ์์ผ๋ก ์ง์ ํด์ ํ์คํ ๊ทธ๋จ์ ๋ถํฌ๋ฅผ ์ข ๋ ๊ท ์ผํ๊ฒ ๋ง๋ค ์ ์๋ค.
๋ค๋ง, ์๋์ธ์ ๋ช ๋๊ฐ ํ ์ชฝ์ผ๋ก ์น์ฐ์ณ์ง (๋๋ฌด ์ด๋ก๊ฑฐ๋ ๋๋ฌด ๋ฐ์) ์ด๋ฏธ์ง๋ ์ ์ฉํ๊ธฐ ์ํํ๋ค. ๋งจ ๋ 50์ฉ์ ์๋ผ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ ์ด๋์ด ์ฌ์ง์ ๋ช ๋๋๋น๋ฅผ ๋๋ ทํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด, ํํํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ผ ์ ํฉํ๋ค. ํํํ๋ ์์์ ๋ฐ๊ธฐ ๋ถํฌ๋ฅผ ์ฌ๋ถ๋ฐฐํ์ฌ ๋ช ์๋๋น๋ฅผ ์ต๋๋ก ๋์ด๋ ๊ธฐ๋ฒ์ด๋ค. ์ ๊ทํ๋ฅผ ํตํด ์งํ๋๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ช ์์ ๋น๋๋ ๋ณ๊ฒฝํ์ง ์์์ ์ด๋์ด ์ฌ์ง์๋ ์ ๋ง ํจ๊ณผ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
3) ๊ธฐํํ์ ๋ณํ
๊ธฐํํ์ ๋ณํ์ ํ์์ ๊ณต๊ฐ์ ์์น๋ฅผ ์ฌ๋ฐฐ์นํ๋ ๊ฒ์ด๋ค. ์ฆ, ๋ช ๋๊ฐ์ด ๋ณํ๋ ๊ฒ์ด ์๋๋ผ ์์น๋ง ๋ณํ๋ค. ์ ์ผ ๋จ์ํ ๊ฒ์ ์ข์ฐ๋ฐ์ ๊ณผ ์ํ๋ฐ์ ์ด๋ค. ์๊ฐํ๊ธฐ๋ ์ฝ๊ณ ์ฝ๋๋ ๋จ์ํ๋ค.
//์ํ๋ฐ์
outImage[i][k] = inImage[outH - i - 1][k];
//์ข์ฐ๋ฐ์
outImage[i][k] = inImage[i][outW - k -1];
์ด๋ฏธ์ง๋ฅผ ํ์ ์ํค๋ ๊ฒ๋ ํฝ์ ์ ์์น๋ง ๋ณํ๋ฉด ๋๋ค. ์ด ๋ ํ์ ํ๋ ค๋ ์์์ ์ค์ฌ์ ๋ ๊ณ ๋ คํด์ ์ํ์ ์ขํ๋ก ๋ณํํ์ฌ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ ์ ํ๊ฒ ๋๋ฉด ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ๋ ์ปค์ง๊ธฐ ๋๋ฌธ์, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ๋ฐ๋ value๊ฐ์ ๋ฐ๋ผ ์ ๋์ ์ผ๋ก ๋ณํ๊ฒ ์ค์ ํด๋์๋ค.
์ด๋ฏธ์ง๋ฅผ ํ๋/์ถ์ ์ํค๋ ์๊ณ ๋ฆฌ์ฆ๋ ๊ฐ์ ํฝ์ ์ ๋๋ฆฌ๊ณ ์ค์ด๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋จ์ํ๋ค. ํ์ง๋ง ๋ ์ ์ถ์ํ๊ณ ํ๋ํ๋ ค๋ฉด ์๊ณ ๋ฆฌ์ฆ์ด ๋ ๋ณต์กํด์ง๋ค.
์ด๋ฏธ์ง ์ถ์๋ ๋จ์ํ๊ฒ 4๊ฐ์ ๋ช ๋๊ฐ ์ค ์์๋ก ํ๋๋ฅผ ๊ณจ๋ผ์ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ 1/2๋ก ์ค์ผ ์๋ ์๊ฒ ์ง๋ง, ์ด๋ ๊ฒ ํ๋ฉด ์ถ์์ ๊ฒฝ๊ณ๊ฐ ๊นจ์ ธ์ ๋ํ๋๊ฒ ๋๋ค. ๋ฐ๋ผ์, ๋๋ ๋ ๋์ ํ์ง์ ์ํด 4๊ฐ์ ํ๊ท ์ ์ถ๋ ฅ ํฝ์ ๊ฐ์ผ๋ก ๋ฐ๊ธฐ๋ก ํ๋ค. ์ด๋ฏธ์ง ์ถ์๋ ๋ฐฐ์ด์ ํ๋ ฌ ํฌ๊ธฐ๋ฅผ 1/2๋ฐฐ๋ก ์ค์ฌ์ผ ํ๋ฏ๋ก, ์ถ๋ ฅ ์ด๋ฏธ์ง์ ๋ฐฐ์ด๋ 1/2๋ฐฐ์ธ ํฌ๊ธฐ๋ก ๋ง๋ค์ด์ค๋ค. (ํ์๋ผ๋ฉด ๊ทธ๋ฅ ์ ์ผ ๋์ ํ๋ ฌ์ ์ ๊ฑฐํ์๋ค) ๋ํ, ์ถ์๋ ๋ 2x2 ํฌ๊ธฐ์ ๋ฐฐ์ด์ด 1x1ํฌ๊ธฐ๋ก ๋๊ธฐ ๋๋ฌธ์ ๋ค ๊ฐ์ value๊ฐ์ ํ๊ท ์ ๋ด์ด ์๋ก์ด ํ๋์ value๋ฅผ ์ง์ ํ์๋ค.
//ํ์ง ๊ฐ์ ์ ๊ณ ๋ คํ์ง ์์ ์ถ์
outImage[parseInt(i*scale)][parseInt(k*scale)] = inImage[i][k];
//ํ์ง ๊ฐ์ ์ ๊ณ ๋ คํ ์ถ์
outImage[i][k] = (inImage[i*2+1][k*2+1] +inImage[i*2+1][k*2]+inImage[i*2][k*2+1]+inImage[i*2][k*2])/4;
2๋ฐฐ ํ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ํ์ง์ ๊ณ ๋ คํ์ง ์๊ณ ๊ทธ๋ฅ ์ธ์ ํ 4๊ฐ์ ํฝ์ ์ ๊ฐ์ ๊ฐ์ผ๋ก ํ ์ ์๋๋ฐ, ์ด๋ ํฝ์ ํํ๊ฐ 2๋ฐฐ๋ก ๋์ด๋๊ธฐ ๋๋ฌธ์ ๊ฒฝ๊ณ๋ฉด์ด ๋งค๋๋ฝ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ๊ณ ์ํ ๋ฐฉ๋ฒ์ ์์ ํ์์ ๊ฐ์ ๊ฐ์ค์น๋ฅผ ์ ์ผ ๋๊ฒ ์ก์ ์ํ์์ ์ฃผ๋ณ ํ์๋ค์ ๊ฐ์ ๊ณ ๋ คํ์ฌ ์ถ๋ ฅ ํฝ์ ๊ฐ์ ๋ฐ๋ ๊ฒ์ด์๋ค. 2๋ฐฐ ํ๋์ ํ์ง๊ฐ์ ์ ๋ํด์๋ ๋ฐ์ ๋งํฌ์ ์์ธํ๊ฒ ์ ํ์๊ณ , ์ฌ๊ธฐ์๋ ๊ณต์๊ณผ ๊ฒฐ๊ณผ๋ง์ ์ฒจ๋ถํ๊ฒ ๋ค.
//ํ์ง ๊ฐ์ ์ ๊ณ ๋ คํ์ง ์์ 2๋ฐฐ ํ๋
outImage[i][k] = inImage[parseInt(i/2)][parseInt(k/2)];
2๋ฐฐ ํ๋ ์๊ณ ๋ฆฌ์ฆ ํ์ง ๊ฐ์ ํ๊ธฐ: https://hanav.tistory.com/140
4) ํ์ ์์ญ ์ฒ๋ฆฌ
ํ์ ์์ญ ์ฒ๋ฆฌ๋ ์ฃผ๋ณ ํ์์ ๊ฐ๋ ๊ฐ์ด ๊ณ ๋ คํ๋ ๊ณต๊ฐ ์์ญ์ ๊ณ์ฐํ๋ค. ์ด ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์๋ ์ฃผ๋ณ ํฝ์ ์ ๊ฐ์ค์น๋ฅผ ๊ณฑํ์ฌ ๊ณ์ฐํ๋๋ฐ, ์ด ๋ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณฑํ ๋๋ ๋ง์คํฌ์ ํฌ๊ธฐ-1๋งํผ ๋ ํฐ ์์ ์ ๋ ฅ ๋ฐฐ์ด์ ๋ง๋ค์ด์ผ ํ๋ค. ๋ ๋์ ์์ฑ๋๋ฅผ ์ํด์๋ ์์ ์ ๋ ฅ ๋ฐฐ์ด์ ๊ฐ์ฅ์๋ฆฌ ๊ฐ๋ ๋น์ทํ๊ฒ ์ค์ ํด์ฃผ๋ฉด ์ข๊ฒ ์ง๋ง, ์ผ๋จ์ ๊ฐ๋จํ๊ฒ ๋น ๊ณต๊ฐ์ 127๋ก ์ฑ์์ ๊ณ์ฐํ์๋ค. ๋ง๋ค์ด์ง ์์ ์ ๋ ฅ ๋ฐฐ์ด์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ๊ณ , ๊ฐ์ค์น ๊ณ์ฐ์ ํด์ฃผ๋ฉด ๋๋ค.
ํ์ ์์ญ ์ฒ๋ฆฌ๋ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ ๋ค ๊ฐ๊ณ , ์ฃผ๋ณ ํ์์ ์์ ํ์๊ฐ์ ๊ฐ์ค์น์ ๋ฐ๋ผ ํจ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์จ๋ค. ๊ฐ ํจ๊ณผ์ ์์ธํ ์ฝ๋์ ์ค๋ช ์ ๋ฐ์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
JavaScript๋ก ์์์ฒ๋ฆฌ ์ํํธ์จ์ด ๋ง๋ค๊ธฐ (Beta ver.): ๋ง์คํฌ ์ฌ์ฉํด์ ์ ๋ณด์ฑ, ๋ธ๋ฌ, ๊ฐ์ฐ์์ ๋ธ๋ฌ,
ํ์ ์์ญ ์ฒ๋ฆฌ๋, ํฝ์ ์ด ์ฃผ๋ณ์ ํฝ์ ๊ฐ์ ์ํฅ์ ๋ฐ์ ์ฒ๋ฆฌ๋๋ ๊ฒ์ ๋งํ๋ค. ์ด ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์๋ ์ฃผ๋ณ ํฝ์ ์ ๊ฐ์ค์น๋ฅผ ๊ณฑํ์ฌ ๊ณ์ฐํ๋๋ฐ, ์ด ๋ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์คํฌ๋ก ๊ฐ์ค์น
hanav.tistory.com
๋ ๋์๊ฐ, ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ์กฐ์ ํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ง๋ณด์๋ค. ๋ง์คํฌ์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ๋ธ๋ฌ ํจ๊ณผ๋ ์ ์ ๋ ๊ฐํด์ง๊ธฐ ๋๋ฌธ์, ๋ง์คํฌ์ ํฌ๊ธฐ๋ฅผ value๋ผ ๋๊ณ ๊ฐ์ ์ ๋ ฅ๋ฐ์๋ค. ํ์ง๋ง ๊ฐ๋ณํ๋ ฌ์ ์ฝ๋๋ก ์ง๊ธฐ์๋ ์ด๋ ค์๋ณด์๊ณ , ๋จ์ ํ๊ท ๊ณ์ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ง ์๊ฒ ์ด์ค for๋ฌธ ์์ ๋ ์ด์ค for๋ฌธ์ด ๋ฐ๋ณต๋๋ ํํ๋ก ๋ํ๋ธ๋ค๋ฉด ์ถฉ๋ถํ ๊ตฌํํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์ด๋๋ ์์ ์ ๋ ฅ ๋ฐฐ์ด์ ๋น ๊ณต๊ฐ์ 127.0์ผ๋ก ์ฑ์์ฃผ์๋ค. ์์ธํ ์ค๋ช ๊ณผ ์ฝ๋๋ ๋ฐ์ ๋งํฌ์ ์ ๋ฆฌํด๋์๋ค.
JavaScript๋ก ์์์ฒ๋ฆฌ ์ํํธ์จ์ด ๋ง๋ค๊ธฐ (Beta ver.): ๋ธ๋ฌ ํจ๊ณผ ์กฐ์ ํ๊ธฐ + ๊ฒฝ๊ณ๊ฐ ์ฒ๋ฆฌํ๊ธฐ
๋ง์คํฌ์ ํฌ๊ธฐ๋ฅผ value by value๋ก ๊ฐ๋ณํ๋ ฌ๋ก ๋ฐ์์ value๊ฐ์ ๋ฐ๋ผ ๋ณํ๊ฒ ํ ์๋ ์๊ฒ ์ง๋ง, ๊ฐ์ฐ์์ ๋ธ๋ฌ๊ฐ ์๋๋ผ ๊ธฐ๋ณธ ๋ธ๋ฌ๋ก ํ๋ค๋ฉด ๋ง์คํฌ๋ฅผ ์ฐ์ง ์๊ณ ๋ ๊ตฌํํ ์ ์์ ๊ฒ์ด๋ค. 1. value๊ฐ 1
hanav.tistory.com
Step4: UI ๊ฐ์ ํ๊ธฐ
๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๋ค ๊ตฌํ์ด ๋์์ผ๋ฉด UI๋ ์ค์ํ๊ธฐ ๋๋ฌธ์ ๋ง์ด ์์ ์ ํ์๋ค.
๋จผ์ select option ํ๊ทธ๋ ํธ์์ฑ๋ ๊ทธ๋ ๊ณ ๋์์ธ์ ์ผ๋ก ๋ง์ด ๋ณ๋ก๋ผ๊ณ ๋๊ปด์ ธ์ list์ submenu๋ฅผ ์๋ก ๋ง๋ค์ด ์์ ํ์๋ค.
๋ํ, ํจ๊ณผ๋ฅผ ์ค๋ณต ์ ์ฉํ๊ณ ์ถ๋ค๋ ์๊ฐ๋ ๋ค์ด ํ์ฌ ํจ๊ณผ๋ฅผ ์ ์ฉํ ์ ์๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ฒํผ๊ณผ ์ฐ๋์์ผฐ๋ค. ํจ๊ณผ๋ฅผ ์ ์ฉํ๋ ํจ์๋ ์ถ๋ ฅ ์ด๋ฏธ์ง๋ฅผ ์ ๋ ฅ ์ด๋ฏธ์ง๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ค๋ฅ๊ฐ ๋๋ ๊ฒฝ์ฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ์๋์ฐฝ์ด ๋จ๋๋ก ์ค์ ํ์๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์๋์ฐฝ์ด ๋ ์ ์คํ์ด ๋์ง ์๋๋ค.
-ํจ๊ณผ๋ฅผ ์ ์ฉํ์ง ์์๋๋ฐ ์ ์ฉ ๋ฒํผ์ ๋๋ ์ ๋
-์ํ๋ ๊ฐ๋๋ก ํ์ ํจ๊ณผ์ 0~360 ์ฌ์ด์ ๊ฐ์ด ์๋ ์ซ์๋ฅผ ์
๋ ฅํ์ ๋
-์ฒซ ์ด๋ฏธ์ง๋ณด๋ค ๋ ํฐ ์ด๋ฏธ์ง๋ก ๋ง๋๋ ํจ๊ณผ๋ฅผ ์ ์ฉ์ํฌ ๋