iT邦幫忙

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

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

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

  • 分享至 

  • twitterImage
  •  

我們一直在處理影像,主要目的是為了讓影像達到我們的要求
細線化、二階化...都是為了讓影像更清楚,方便後續處理
但有時候我們也希望讓影像模糊一點,因此出現了馬賽克
而我們在為自己的照片修圖時(把粗糙的皮膚做平滑處理),也是把部分影像模糊,這種技術叫:影像模糊化 (Image Smoothing)
又稱:影像平滑化

原理:
https://ithelp.ithome.com.tw/upload/images/20171228/20107818sdWVORIZER.png

  1. 從某一像素(中間像素),往八方面延伸,形成3x3的遮罩
  2. 而9個方格加權比率均為1 (加權比率也會影響影像模糊強度,但目前我們先用1來測試)
  3. 9個方格的像素再加,要除9
  4. 得到平均值後,把值return回中間像素
    https://ithelp.ithome.com.tw/upload/images/20171228/20107818bLK55Ff7sD.png

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

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;
    }

======================程式解說======================

int effect(ImageData *img,ImageData *outimg)

呼叫的function命名為effect
我們利用指標方式輸入影像,ImageData *img
影像處理後,再利用指標方式輸出影像,ImageData *outimg

//~~~~~~~~~~~~~~~~~~~~

int fil[9]={
  	 1, 1, 1,
	 1, 1, 1,
	 1, 1, 1};

這是9個方格加權比率,而我們先把比率設定為1
令影像做達到輕微的平滑效果

//~~~~~~~~~~~~~~~~~~~~

x2=img->width-1;
y2=img->height-1;

設定影像處理時的最高大小
為防止3x3的遮罩超出影像的邊界,因此設定最高處理範圍

//~~~~~~~~~~~~~~~~~~~~

val = getPixel(img,x+xx,y+yy,&pix);
rr += pix.r * fil[ff];
gg += pix.g * fil[ff];
bb += pix.b * fil[ff];

我們先呼叫影像(呼叫方式,橫,直,像素),val = getPixel(img,x+xx,y+yy,&pix);
再把單一像素 乘 相對的加權比率
因為影像有機會是24-bit圖檔,因此我們把RGB分開 乘 相對的加權比率
並由RGB分別作累加的動作

//~~~~~~~~~~~~~~~~~~~~

pix.r=rr/9;
pix.g=gg/9;
pix.b=bb/9;

累加結束後,我們再分別把RGB除9,取得平均值
並傳回相對的指標中

//~~~~~~~~~~~~~~~~~~~~

setPixel(outimg,x,y,&pix);	

此function用途是為了收歛影像
我們處理影像後,像素有機會超過0~255
因此我們需要把超過255的像素,設定為255
把低於0的像素,設定為0

======================執行結果======================

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

https://ithelp.ithome.com.tw/upload/images/20171228/2010781899TsUyZXxF.png
上圖為模糊化之影像,加權率為1

//~~~~~~~~~~~~~~~~~~~~

這種模糊感,可能大家有似是而非的感覺
因為輸入影像並沒有太多的像素變化
我們來輸入其他影像看看效果

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

https://ithelp.ithome.com.tw/upload/images/20171228/20107818OKc0Soh0fZ.png
上圖為模糊化之影像,加權率為1

這一次我們有看到明顯的模糊
影像處理後,雖然有少許去雜訊的效果,但同時也把影像模糊
令影像平滑的同時,也會令影像模糊

今天有點忙...抱歉
先到這裡
下一次會繼續講,不同加權比率所產生的效果

==============題外話==============

/images/emoticon/emoticon09.gif
最近報名公司開辦的訓練營,因為私立學校的關系被優先刷走,有點不開心
現在更希望可以從不同的管道提升自己的實力
讓看不起我的人,注視著我/images/emoticon/emoticon08.gif
所以,首先要30天撐過去/images/emoticon/emoticon78.gif


上一篇
輕談:struct結構是多此一項嗎?[1]入門
下一篇
[影像處理系列] 影像模糊化[2]
系列文
提神?看程式比喝咖啡更有效。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言