話不多說,我們來看看5x5遮罩會有什麼效果
我們先看看 一階5x5的遮罩
int effect(ImageData *img,ImageData *outimg)
{
int fil[25]={
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1};
int val;
int x1,y1,x2,y2;
int x,y;
int xx,yy;
int ff;
int rr,gg,bb;
Pixel pix;
x1=0;
y1=0;
x2=img->width-2;
y2=img->height-2;
for(y=y1;y<=y2;y++) {
for(x=x1;x<=x2;x++) {
val=0;
ff=0;
rr=gg=bb=0;
for(yy=-2;yy<=2;yy++) {
for(xx=-2;xx<=2;xx++) {
val = getPixel(img,x+xx,y+yy,&pix);
rr += pix.r * fil[ff];
gg += pix.g * fil[ff];
bb += pix.b * fil[ff];
ff++;
}
}
pix.r=rr/25;
pix.g=gg/25;
pix.b=bb/25;
setPixel(outimg,x,y,&pix);
}
}
return 1;
}
====================分格線====================
接下來再看 多階5x5的遮罩
int effect(ImageData *img,ImageData *outimg)
{
int fil[25]={
4, 4, 4, 4, 4,
4, 4, 4, 4, 4,
4, 4, 1, 4, 4,
4, 4, 4, 4, 4,
4, 4, 4, 4, 4};
int val;
int x1,y1,x2,y2;
int x,y;
int xx,yy;
int ff;
int rr,gg,bb;
Pixel pix;
x1=0;
y1=0;
x2=img->width-2;
y2=img->height-2;
for(y=y1;y<=y2;y++) {
for(x=x1;x<=x2;x++) {
val=0;
ff=0;
rr=gg=bb=0;
for(yy=-2;yy<=2;yy++) {
for(xx=-2;xx<=2;xx++) {
val = getPixel(img,x+xx,y+yy,&pix);
rr += pix.r * fil[ff];
gg += pix.g * fil[ff];
bb += pix.b * fil[ff];
ff++;
}
}
pix.r=rr/97;
pix.g=gg/97;
pix.b=bb/97;
setPixel(outimg,x,y,&pix);
}
}
return 1;
}
====================分格線====================
一階7x7的遮罩
int effect(ImageData *img,ImageData *outimg)
{
int fil[49]={
1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1};
int val;
int x1,y1,x2,y2;
int x,y;
int xx,yy;
int ff;
int rr,gg,bb;
Pixel pix;
x1=0;
y1=0;
x2=img->width-3;
y2=img->height-3;
for(y=y1;y<=y2;y++) {
for(x=x1;x<=x2;x++) {
val=0;
ff=0;
rr=gg=bb=0;
for(yy=-3;yy<=3;yy++) {
for(xx=-3;xx<=3;xx++) {
val = getPixel(img,x+xx,y+yy,&pix);
rr += pix.r * fil[ff];
gg += pix.g * fil[ff];
bb += pix.b * fil[ff];
ff++;
}
}
pix.r=rr/49;
pix.g=gg/49;
pix.b=bb/49;
setPixel(outimg,x,y,&pix);
}
}
return 1;
}
====================分格線====================
一階13x13的遮罩
int effect(ImageData *img,ImageData *outimg)
{
int fil[169]={1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1};
int val;
int x1,y1,x2,y2;
int x,y;
int xx,yy;
int ff;
int rr,gg,bb;
Pixel pix;
x1=0;
y1=0;
x2=img->width-6;
y2=img->height-6;
for(y=y1;y<=y2;y++) {
for(x=x1;x<=x2;x++) {
val=0;
ff=0;
rr=gg=bb=0;
for(yy=-6;yy<=6;yy++) {
for(xx=-6;xx<=6;xx++) {
val = getPixel(img,x+xx,y+yy,&pix);
rr += pix.r * fil[ff];
gg += pix.g * fil[ff];
bb += pix.b * fil[ff];
ff++;
}
}
pix.r=rr/169;
pix.g=gg/169;
pix.b=bb/169;
setPixel(outimg,x,y,&pix);
}
}
return 1;
}
====================結果====================
以上為原始影像
以上為一階3x3遮罩影像
以上為一階5x5遮罩影像
以上為一階7x7遮罩影像
以上為一階13x13遮罩影像
從上述的影像得知:
由於遮罩愈大,可得到較多的周邊參考值
因此同一階數,遮罩愈大,影像愈模糊,但同時執行時間也相對較久
當然,我們也可以對影像使用多次一階3x3遮罩的程式來達到一次一階13x13遮罩影像