2016年12月26日 星期一

03360812蔡杰修 HW05

本次作業內容是Filter濾波器
濾波器根據不同的效果還分成很多種
而這次所教的Filter有平滑(Smoothing)濾波器、銳化(Sharping)濾波器和中值濾波器

首先是平滑濾波器
它主要是對圖片模糊化和減少雜訊
此為原本的遮罩(一個正常圖片)

下圖為平滑濾波器的遮罩圖
此遮罩上的數字為權重,類似將圖片的像素分成9塊,而每塊所佔的比例,平滑濾波的權重注重中心的比例所以已中心為準,越外層的權重越低。
遮罩對應以下程式碼:
iSum=     1 *bptrImageRow0[(i-1)*3+k] + 2 *bptrImageRow0[i*3+k] +  1 *bptrImageRow0[(i+1)*3+k]
           +  2 *bptrImageRow1[(i-1)*3+k] + 4 *bptrImageRow1[i*3+k] +  2 *bptrImageRow1[(i+1)*3+k]
          +  1 *bptrImageRow2[(i-1)*3+k] + 2 *bptrImageRow2[i*3+k] +  1 *bptrImageRow2[(i+1)*3+k];
這段程式碼基本上就是濾波器的核心了,其他種的濾波器也都是改這裡的權重參數就可以呈現了,當然還要加上該設的條件。
原圖1

經平滑濾波器的圖1

撒胡椒鹽的圖1

經平滑濾波的胡椒鹽圖1

結果確實有模糊化,但雜訊也是被模糊,並沒有太多的消除。

再來是銳化濾波器

這是銳化濾波器的遮罩圖
程式碼也是
iSum=  -1 *bptrImageRow0[(i-1)*3+k] + -1 *bptrImageRow0[i*3+k] +  -1 *bptrImageRow0[(i+1)*3+k]
         + -1 *bptrImageRow1[(i-1)*3+k] +  9 *bptrImageRow1[i*3+k] +  -1 *bptrImageRow1[(i+1)*3+k]           + -1 *bptrImageRow2[(i-1)*3+k] + -1 *bptrImageRow2[i*3+k] +  -1 *bptrImageRow2[(i+1)*3+k];
不過還需要加上
if(iSum>255) iSum=255;
if(iSum<0)iSum=0;
以免超出範圍0-255

原圖2

經銳化濾波後的圖2

銳化濾波器的目的聽名字就知道了,它就是要把圖片的特點銳化特化出來,很明顯的月球的坑洞輪廓變深了,被強調出來了。

最後是中值濾波器
在做中值濾波之前要先做胡椒鹽雜訊
胡椒鹽圖3(8%)

胡椒鹽圖4(20%)
雜訊做完後才是輪到中值濾波器上場
中值濾波器主要是消除脈衝雜訊
它的遮罩是需要排列的,將色彩像素作排列後,取最中間的值
這就需要把核心程式碼做點變化了。
我的作法是將那九格的色彩像素存在陣列中進行排列,輸出就是最中間的那個值。
經中值濾波後的胡椒鹽圖3(8%)

經中值濾波後的胡椒鹽圖4(20%)

中值濾波器的確有消除雜訊的效果,但如果雜訊太多的話,可能就沒辦法完全消除了。

結論:我覺得基本上整個濾波器的核心就是
iSum=  -1 *bptrImageRow0[(i-1)*3+k] + -1 *bptrImageRow0[i*3+k] +  -1 *bptrImageRow0[(i+1)*3+k]
         + -1 *bptrImageRow1[(i-1)*3+k] +  9 *bptrImageRow1[i*3+k] +  -1 *bptrImageRow1[(i+1)*3+k]           + -1 *bptrImageRow2[(i-1)*3+k] + -1 *bptrImageRow2[i*3+k] +  -1 *bptrImageRow2[(i+1)*3+k];
再來是依想要的效果進行修改,而遮罩的部分可能就需要用到微積分來取得了,最後還須要想一下它是否會超過範圍0-255再加上限制就不會出錯了。

沒有留言:

張貼留言