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

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

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


1.空間域加強

(1)模版運算

圖像處理中。模版可以看做是n*n(n一般是奇數)的窗體。模版連續地運動於整個圖像中,對模版窗體範圍內的像素作相應處理。markdown

模版運算主要分爲:函數

  • 模版卷積
  • 模版排序

模版卷積是把模版內像素的灰度值和模版中相應的灰度值相乘,求平均值賦給當前模版窗體的中心像素。做爲它的灰度值;性能

模版排序是把模版內像素的灰度值排序,取某個順序統計量做爲模版中心像素灰度值。優化

Matlab中作模版卷積十分高效,取出模版內子矩陣和模版權重點乘求平均就能夠ui

咱們很是easy想到模版的中心點是邊界的特殊狀況。處理邊界有很是多種作法:spa

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

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

外插邊界顧名思義就是補齊邊界點做爲模版中心時缺失的像素部分,可以賦予補邊像素必定的灰度值並做計算。優勢在於不犧牲性能的狀況下,對邊界進行了處理。但是補邊像素的灰度值設定勢必致使邊界的像素點的不連貫性,嚴重狀況下致使失真;排序

改變模版領域是指在邊界處理中改變模版窗體的大小,爲邊界作特殊處理,如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

這裏我調用了一系列的maxmin函數避免寫起來比較繁雜的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)平滑結果展現

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

這裏寫圖片描寫敘述

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

這裏寫圖片描寫敘述

(2)討論

這裏並無數學理論的數學分析。也沒有給出樣例。僅僅是從直觀理解角度簡要分析:

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

    而均值濾波處理階躍值時分配權重不會變化。那麼求平均值時受階躍值影響而產生的偏差就較大。所以效果不理想。

  2. 高斯噪聲是圖像中每個像素點都從原灰度值依據高斯分佈作隨機噪聲。那麼選取中值的表明意義並不大,因爲各個像素都是獨立同分布的。中值濾波至關於在模版內再選出了一個通過高斯噪聲變換後的灰度值,濾波效果和噪聲圖像沒有明顯改善,因此比較之下均值濾波較優。
相關文章
相關標籤/搜索