iT邦幫忙

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

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

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

  • 分享至 

  • xImage
  •  

接下來,我們試著把影像作不同程式的模糊

一階3x3遮罩的模糊輸出的程式:

int effect(ImageData *img,ImageData *outimg)
{
    int fil[9]={
    	 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-1;
	y2=img->height-1;
	for(y=y1;y<=y2;y++) {
		for(x=x1;x<=x2;x++) {
			val=0;
			ff=0;
			rr=gg=bb=0;
			for(yy=-1;yy<=1;yy++) {			
				for(xx=-1;xx<=1;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/9;
			pix.g=gg/9;
			pix.b=bb/9;
			setPixel(outimg,x,y,&pix);	
		}
	}
	return 1;
}

一階3x3遮罩圖形:
https://ithelp.ithome.com.tw/upload/images/20171230/20107818CBMAHE2sxh.png

=======================分格線=======================

二階3x3遮罩的模糊輸出的程式:

int effect(ImageData *img,ImageData *outimg)
{

    int fil[9]={
    	 1, 2, 1,
    	 2, 4, 2,
    	 1, 2, 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-1;
	y2=img->height-1;
	for(y=y1;y<=y2;y++) {
		for(x=x1;x<=x2;x++) {
			val=0;
			ff=0;
			rr=gg=bb=0;
			for(yy=-1;yy<=1;yy++) {			
				for(xx=-1;xx<=1;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/16;
			pix.g=gg/16;
			pix.b=bb/16;
			setPixel(outimg,x,y,&pix);	
		}
	}
	return 1;
}

二階3x3遮罩圖形:
https://ithelp.ithome.com.tw/upload/images/20171230/20107818YktAonP0yV.png
我們先修改加權比率

=======================分格線=======================

根據影像模糊化的理論公式中得出
只要我們把周邊的加權比率提高,輸出影像愈是模糊
所以我們來驗證一下
所以我把周邊的比率提高,而中心點數值固定

多階3x3遮罩的模糊輸出的程式:

int effect(ImageData *img,ImageData *outimg)
{
    int fil[9]={
    	 64, 64, 64,
    	 64, 1,  64,
    	 64, 64, 64};
    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-1;
	y2=img->height-1;
	for(y=y1;y<=y2;y++) {
		for(x=x1;x<=x2;x++) {
			val=0;
			ff=0;
			rr=gg=bb=0;
			for(yy=-1;yy<=1;yy++) {			
				for(xx=-1;xx<=1;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/513;
			pix.g=gg/513;
			pix.b=bb/513;
			setPixel(outimg,x,y,&pix);	
		}
	}
	return 1;
}

多階3x3遮罩圖形:
https://ithelp.ithome.com.tw/upload/images/20171230/20107818lA2UIlKFap.png

=======================分格線=======================

效果看似不太明顯
所以我們需要把比率拉更大

大比率3x3遮罩的模糊輸出的程式:

int effect(ImageData *img,ImageData *outimg)
{

    int fil[9]={
    	 16, 0, 16,
    	 0, -16,  0,
    	 16, 0, 16};
    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-1;
	y2=img->height-1;
	for(y=y1;y<=y2;y++) {
		for(x=x1;x<=x2;x++) {
			val=0;
			ff=0;
			rr=gg=bb=0;
			for(yy=-1;yy<=1;yy++) {			
				for(xx=-1;xx<=1;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/48;
			pix.g=gg/48;
			pix.b=bb/48;
			setPixel(outimg,x,y,&pix);	
		}
	}
	return 1;
}

大比率3x3遮罩圖形:
https://ithelp.ithome.com.tw/upload/images/20171230/20107818O5kUdWQs5U.png

=======================不同比率3x3遮罩結果=======================

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

https://ithelp.ithome.com.tw/upload/images/20171230/20107818A4SvSx6bgE.png
上圖為一階3x3遮罩

https://ithelp.ithome.com.tw/upload/images/20171230/20107818FFdncIQMSx.png
上圖為二階3x3遮罩

https://ithelp.ithome.com.tw/upload/images/20171230/20107818xWOetlA8S5.png
上圖為多階3x3遮罩

https://ithelp.ithome.com.tw/upload/images/20171230/20107818ygnJQL28Ds.png
上圖為大比率3x3遮罩

結論:
在固定3x3遮罩的情況下,影像周邊的加權比率提高,輸出影像愈是模糊
但由於3x3的遮罩,可參考的影像周邊有限(只有8格),因此影像只能作有限度的模糊


上一篇
[影像處理系列] 影像模糊化[1]
下一篇
[影像處理系列] 影像模糊化[3]
系列文
提神?看程式比喝咖啡更有效。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言