ํ์ ์์ญ ์ฒ๋ฆฌ๋, ํฝ์
์ด ์ฃผ๋ณ์ ํฝ์
๊ฐ์ ์ํฅ์ ๋ฐ์ ์ฒ๋ฆฌ๋๋ ๊ฒ์ ๋งํ๋ค.
์ด ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์๋ ์ฃผ๋ณ ํฝ์
์ ๊ฐ์ค์น๋ฅผ ๊ณฑํ์ฌ ๊ณ์ฐํ๋๋ฐ, ์ด ๋ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ๋ค.
๋ง์คํฌ๋ก ๊ฐ์ค์น๋ฅผ ๊ณฑํ๋ ๋ฒ
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();
}
6. ์ค๊ณฝ์ (์ฃ์ง)
์ฃ์ง๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๊ณ , ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ ํ๋์ ์ ๋ช ๋๊ฐ ๋ฌ๋ผ์ง๋ค.