iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 15
0
Software Development

提神?看程式比喝咖啡更有效。系列 第 15

[影像處理系列] 影像模糊化[3]

話不多說,我們來看看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;
}

====================結果====================

https://ithelp.ithome.com.tw/upload/images/20171230/20107818yUUEPP8HAR.png
以上為原始影像

https://ithelp.ithome.com.tw/upload/images/20171230/201078184MtSZJECiL.png
以上為一階3x3遮罩影像

https://ithelp.ithome.com.tw/upload/images/20171230/20107818KN9hR1sRFd.png
以上為一階5x5遮罩影像

https://ithelp.ithome.com.tw/upload/images/20171230/20107818ByMzOfVDjs.png
以上為一階7x7遮罩影像

https://ithelp.ithome.com.tw/upload/images/20171230/20107818a9B7rImsYd.png
以上為一階13x13遮罩影像

從上述的影像得知:
由於遮罩愈大,可得到較多的周邊參考值
因此同一階數,遮罩愈大,影像愈模糊,但同時執行時間也相對較久
當然,我們也可以對影像使用多次一階3x3遮罩的程式來達到一次一階13x13遮罩影像


上一篇
[影像處理系列] 影像模糊化[2]
下一篇
輕談:移位比乘法好,那還要乘法幹什麼?[1]
系列文
提神?看程式比喝咖啡更有效。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言