2014年1月25日 星期六

[Matlab]如何去除圖像中的椒鹽雜訊(1)? 均值濾波(mean filter)


仔細看,似乎有一些微小顆粒參雜在上圖,沒有錯,這在圖像處理領域中,一般被稱為椒鹽雜訊(salt & pepper noise)。其特點是以黑點或是白點形式呈現,形同一粒粒"黑色"胡椒或是"白色"鹽巴灑在圖片上。換句話說,以8位元灰階圖為例,像素灰階值範圍由0~255,"黑色"胡椒的數值是0,"白色"鹽巴的數值則為255。

OK,如何消除這種令人感到雜亂的椒鹽雜訊,使得圖像表現更加清晰呢?
一般常用的方式有兩種:

1.均值濾波(mean filter): 

顧名思義,其指的是擷取周圍其他像素灰階的平均值做為該像素的灰階值,至於擷取周遭多大的範圍,端看遮罩濾片設定的尺寸大小。然而,均值濾波的缺點是圖像處理後易造成模糊,邊緣明暗的銳利度會失真。


2.中值濾波(median filter): 

相較於均值濾波,其指的是擷取周圍其他像素灰階的中值做為該像素的灰階值,所以該方法需要先對遮罩濾片內的灰階值進行排序,再挑出中值。


對於椒鹽雜訊來說,中值濾波的效果明顯優於均值濾波,原因是中值濾波利用排序方式取出中值,自然不會擷取到最大值255或是最小值0(除非遮罩濾片範圍內全是最大值255或是最小值0)。但均值濾波則是將最大值255或是最小值0一起計算得到平均值。

先來試試均值濾波對於椒鹽雜訊的效果吧~~

圖一是利用matlab簡易實現均值濾波的程式碼,其中包含如何產出具有椒鹽雜訊的圖像,和兩種可計算均值濾波的matlab指令。

圖一

圖二是任意擷取圖像的一行灰階數值,並比較濾波前(藍線)和濾波後(紅線)的效果,其中明顯看到濾波後已不再出現濾波前的0和255灰階值了。

圖二

圖三是均值濾波後的圖,邊緣明暗銳利度沒有明顯失真的狀況,或許之後以文字或數字等等屬於需高銳利度的圖像,應可明顯看出失真的狀況。

圖三
延伸閱讀:[Matlab]如何去除圖像中的椒鹽雜訊(2)? 中值濾波(median filter)

6 則留言:

  1. 請問版主,我照著你的寫法去做,figure(5)的結果卻是錯誤,說是向量值不同,可以請問是何解嗎?

    回覆刪除
    回覆
    1. 志賢您好:
      根據您的描述,初步推測您看到的錯誤訊息可能是Vectors must be the same lengths.研判應是最後一行程式碼的1:length(im_noise)和im_noise(1,:)之間或是1:length(im_fil1)和im_fil1(1,:)之間的數值個數不一致所造成的,建議您檢查這個部分或是將您的程式碼寄給我。

      刪除
    2. 版主你好,請問一下那是不是你程式裡1:length(im_noise)和im_noise(1,:)這一段的(1,:)冒號需要有實際的數值並且和下一段1:length(im_fil1)和im_fil1(1,:)裡的(1,:)冒號數值要一樣才會有實際的比較性,因為我想一樣畫出你上述圖五的頻域比較圖,不好意思!我是初學者對這比較不清楚,還請多加指導!

      刪除
    3. 志賢您好:
      是的,(1,:)表示取第一列的所有數值出來作圖,而plot(1:length(im_noise),im_noise(1,:))表示以1:length(im_noise)為橫坐標,im_noise(1,:)為縱座標進行作圖,兩者的數值個數必須一樣才可順利畫出。因為該程式是抓取同一張圖像濾波前後的數值,若無更改程式碼,Figure. 5應可順利畫出。
      以上,供您參考。

      刪除
    4. 版主你好又是我,我這次把程式裡的冒號全都取150,圖5有產出,但是紅藍線全都變成直線,並沒有你原PO裡的波形圖,這又是何解啊?!

      刪除

  2. Undefined function or variable 'im_fil_average'.

    Error in test01 (line 22)
    plot(1:length(im_noise),im_noise (5,:),'k',1:length(im_fil_average),im_fil_average(5,:),'r',1:length(im_fil_median),im_fil_mefian(5,:),'b');

    回覆刪除