原來是不做影像處理這塊的, 所以對這裡的專用名字不是特別感冒, 濾波器聽來玄而又玄。真正拿來看了之後就不過爾爾了, 這把拿了一個均值濾波器的例子來做記錄, 希望可以依次把一些median filter, gaussian blur都拿來說說。
好吧言歸正傳, 這裡就具體說說均值濾波器是什麼東西吧。其實這個東西就是在影像處理的時候, “把每個像素都用周圍的8個像素來做均值操作
”, 比如說這裡有一個例子:
圖通常是最能說明問題的東西, 非常明顯的, 這個3*3地區像素的顏色值分別是5,3,6,2,1,9,8,4,7那麼中間的1這個像素的過濾後的值就是這些值的平均值, 也就是前面的計算方法: (5+3+6+2+1+9+8+4+7)/9=5
一目瞭然。那麼這個均值濾波器有什麼用處呢?
主要還是平滑映像的用處, 有的映像的銳度很高,用這樣的均值演算法,可以把銳度降低。使得映像看上去更加自然,下面就有幾幅圖我們可以看出一些端倪:
原圖: 平滑處理之後:
這裡還是可以明顯的感覺到不同的, 沒有好壞之分,就是第二幅圖片看上去更為平滑。 繼續我們的問題, 那這裡均值平滑是否具有去除雜訊的功能呢? 我們搞來了椒鹽雜訊(就是隨機的白點,黑點)來試試手:
雜訊圖(5%): 平滑處理之後:
首先這裡的雜訊還是比較小的, 只有5%,從均值的效果來看的話, 我可以說幾乎沒有用,其實直觀的想也可以判斷, 因為這裡的處理並沒有剔除這些雜訊點, 而只是微弱地降低了雜訊,所以效果可以想見的。。
好吧, 最後的時候還是貼上一段處理的代碼:
/**<br />** method to remove noise from the corrupted image by mean value<br />* @param corrupted input grayscale binary array with corrupted info<br />* @param smooth output data for smooth result, the memory need to be allocated outside of the function<br />* @param width width of the input grayscale image<br />* @param height height of the input grayscale image<br />*/<br />void meanFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)<br />{</p><p>memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );</p><p>for (int j=1;j<height-1;j++)<br />{<br />for (int i=1;i<width-1;i++)<br />{<br />smooth [ j*width+i ] = (corrupted [ (j-1)*width+(i-1) ] + corrupted [ (j-1)*width+i] + corrupted [ (j-1)*width+(i+1) ] +<br />corrupted [ j*width+(i-1) ]+ corrupted [ j*width+i] + corrupted [ j*width+(i+1) ] +<br />corrupted [ (j+1)*width+(i-1) ] + corrupted [ (j+1)*width+i] + corrupted [ (j+1)*width+(i+1) ] ) / 9;<br />}<br />}<br />}
說明一下,我比較偷懶。一般處理的時候通常還有邊界上的一些處理, 但是我這裡就簡單的從1...width-1來處理, 所以第一個和最後一個像素就簡單的拋掉了, 如果只是簡單的看看效果還是沒有問題的!