濾波器根據不同的效果還分成很多種
而這次所教的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再加上限制就不會出錯了。
沒有留言:
張貼留言