天天看點

Matlab圖像處理系列2———空間域平滑濾波器

注:本系列來自于圖像處理課程實驗,用Matlab實作最主要的圖像處理算法

本文章是Matlab圖像處理系列的第二篇文章。介紹了空間域圖像處理最主要的概念————模版和濾波器,給出了均值濾波起和中值濾波器的Matlab實作。最後簡要讨論去躁效果。

1.空間域增強

(1)模版運算

圖像進行中。模版能夠看作是n*n(n通常是奇數)的窗體。模版連續地運動于整個圖像中,對模版窗體範圍内的像素做相應處理。

模版運算主要分為:

  • 模版卷積
  • 模版排序

模版卷積是把模版内像素的灰階值和模版中相應的灰階值相乘,求平均值賦給目前模版窗體的中心像素。作為它的灰階值;

模版排序是把模版内像素的灰階值排序,取某個順序統計量作為模版中心像素灰階值。

Matlab中做模版卷積十分高效,取出模版内子矩陣和模版權重點乘求平均就可以

我們非常easy想到模版的中心點是邊界的特殊情況。處理邊界有非常多種做法:

  • 忽略邊界
  • 外插邊界
  • 改變模版領域

忽略邊界是模版直接在非邊界點運動操作,直接忽略這些邊界點。這麼做的優點當然是效率高,比較适合圖像尺寸較大或人們感興趣部分不在圖像邊緣的情況;

外插邊界顧名思義就是補齊邊界點作為模版中心時缺失的像素部分,能夠賦予補邊像素一定的灰階值并作計算。優點在于不犧牲性能的情況下,對邊界進行了處理。可是補邊像素的灰階值設定勢必導緻邊界的像素點的不連貫性,嚴重情況下導緻失真;

改變模版領域是指在邊界進行中改變模版窗體的大小,為邊界做特殊處理,如

3*3

模版在處理最左上角像素點時僅僅考慮圖像内點

2*2

的模版運算。這樣為邊界特殊考慮既不失真又沒有忽略不論什麼像素點。可是在推斷邊界時勢必會産生一定的開銷。稍微會影響圖像處理的性能(能夠分情況寫,在犧牲程式複雜度的情況下彌補推斷帶來的開銷)。

不論什麼的邊界處理都不是完美的,都在一定程度上又一次配置設定了模版權重。

(2)空間域濾波

把模版運算運用于圖像的空間域增強的技術稱為空間域濾波。依據濾波頻率空間域濾波分為平滑濾波(減弱和去除高頻分量)和銳化濾波(減弱和去除低頻分量),依據濾波計算特點又分為線性濾波和非線性濾波。

是以空間域濾波可分為:

分類 線性 非線性
平滑 線性平滑 非線性平滑
銳化 線性銳化 非線性銳化

2.均值濾波

(1)均值濾波器

領域均值濾波顧名思義是就是求模版内像素點灰階的均值。是最經典的線性平滑濾波。空域濾波經常使用于去除加性噪聲,通常把濾波算法封裝的子產品稱作濾波器。

均值濾波的模版就是

ones(n, n)

,模版内全部元素均是一,即他們的權重一模一樣。

其它經常使用的線性濾波還有:

  • 權重濾波:通常中心元素權重較大,且對稱向外遞減
  • 高斯濾波:權重濾波的特例,依據高斯分布确定模版系數

(2)代碼實作

先調用Matlab函數給圖像加入3%的椒鹽噪聲:

salt = imnoise(original,\'salt & pepper\',0.03);
           

接下來構造我們的均值濾波器。我採用改變模版領域。也就是對邊界條件推斷做特殊處理:

function [ filtered ] = MeanFilter( noise )

    filtered = noise;

    h = size(filtered, 1);
    w = size(filtered, 2);

    for i = 1 : h
        for j = 1 : w
            up = max(i - 1, 1);
            down = min(i + 1, h);
            left = max(j - 1, 1);
            right = min(j + 1, w);
            filtered(i, j) = mean(mean(noise(up : down, left : right)));
        end
    end

end           

這裡我調用了一系列的

max

min

函數避免寫起來比較繁雜的if語句。确定了模版邊界後直接調用

mean

函數求均值,淡化了模版卷積的概念(後面邊緣檢測中會顯式地做模版卷積)。

3.中值濾波

(1)中值濾波器

中值濾波選取模版中像素灰階值的中位數賦給模版中心像素,是經典的非線性平滑濾波。

理想情況下,中值濾波的椒鹽去噪效果優于均值濾波。是由于它能有效的消除孤立階躍脈沖噪聲。後面将比較分析。

2-D中值濾波也能夠選取各種各樣的模版,我在這裡就選取最簡單的8-領域模版做示範。

(2)代碼實作

相同我檢測邊界。做特殊處理:

function [ filtered ] = MedianFilter( noise )
    filtered = noise;

    h = size(filtered, 1);
    w = size(filtered, 2);

    for i = 1 : h
        for j = 1 : w
            up = max(i - 1, 1);
            down = min(i + 1, h);
            left = max(j - 1, 1);
            right = min(j + 1, w);
            sub = noise(up : down, left : right);
            sub = sub(:);
            filtered(i, j) = median(sub);
        end
    end

end           

僅僅須要将子矩陣轉成向量。再求

median

就可以。

注:我沒有細緻研究Matlab median函數實作方式,如果它是一個平方量級的算法,那麼我們有以下兩種優化方式,來提升中值濾波的速度:

  • 尋求效率更高的順序統計量算法。見算法導論——期望為線性時間的選擇算法和最壞情況為線性時間的選擇算法
  • 利用模版移動的連續性。鄰近移動區域僅僅有少量像素點不同,能夠依據模版的這個性質構造線性時間的增量式順序統計量算法

4.兩種濾波器結果對照讨論

(1)平滑結果展示

以下是椒鹽噪聲的去除效果,中值濾波的效果更優:

Matlab圖像處理系列2———空間域平滑濾波器

以下是高斯噪聲的去除效果,均值濾波的效果更優:

Matlab圖像處理系列2———空間域平滑濾波器

(2)讨論

這裡并沒有數學理論的數學分析。也沒有給出樣例。僅僅是從直覺了解角度簡要分析:

  1. 中值濾波去除椒鹽效果更好。由于椒鹽噪聲是階躍脈沖噪聲(取值0或255且小機率出現),中值濾波是去中位數,不會被階躍值影響,是以差點兒能全然過濾掉階躍脈沖噪聲。

    而均值濾波處理階躍值時配置設定權重不會變化。那麼求平均值時受階躍值影響而産生的誤差就較大。是以效果不理想。

  2. 高斯噪聲是圖像中每一個像素點都從原灰階值依據高斯分布做随機噪聲。那麼選取中值的代表意義并不大,由于各個像素都是獨立同分布的。中值濾波相當于在模版内再選出了一個經過高斯噪聲變換後的灰階值,濾波效果和噪聲圖像沒有明顯改善,是以比較之下均值濾波較優。