注:本系列來自於圖像處理課程實驗,用Matlab實現最基本的圖像處理算法
本文章是Matlab圖像處理系列的第二篇文章,介紹了空間域圖像處理最基本的概念————模版和濾波器,給出了均值濾波起和中值濾波器的Matlab實現,最後簡要討論去躁效果。
1.空間域增強
(1)模版運算
圖像處理中,模版可以看作是n*n(n一般是奇數)的窗口,模版連續地運動於整個圖像中,對模版窗口範圍內的像素做相應處理。
模版運算主要分爲:
- 模版卷積
- 模版排序
模版卷積是把模版內像素的灰度值和模版中對應的灰度值相乘,求平均值賦給當前模版窗口的中心像素,作爲它的灰度值;
模版排序是把模版內像素的灰度值排序,取某個順序統計量作爲模版中心像素灰度值。
Matlab中做模版卷積十分高效,取出模版內子矩陣和模版權重點乘求平均即可
我們很容易想到模版的中心點是邊界的特殊情況,處理邊界有很多種做法:
- 忽略邊界
- 外插邊界
- 改變模版領域
忽略邊界是模版直接在非邊界點運動操作,直接忽略這些邊界點。這麼做的好處當然是效率高,比較適合圖像尺寸較大或人們感興趣部分不在圖像邊緣的情況;
外插邊界顧名思義就是補齊邊界點作爲模版中心時缺失的像素部分,可以賦予補邊像素一定的灰度值並作計算。優點在於不犧牲性能的情況下,對邊界進行了處理,但是補邊像素的灰度值設定勢必導致邊界的像素點的不連貫性,嚴重情況下導致失真;
改變模版領域是指在邊界處理中改變模版窗口的大小,爲邊界做特殊處理,如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)平滑結果展示
下面是椒鹽噪聲的去除效果,中值濾波的效果更優:
下面是高斯噪聲的去除效果,均值濾波的效果更優:
(2)討論
這裏並沒有數學理論的數學分析,也沒有給出例子,只是從直觀理解角度簡要分析:
- 中值濾波去除椒鹽效果更好,因爲椒鹽噪聲是階躍脈衝噪聲(取值0或255且小概率出現),中值濾波是去中位數,不會被階躍值影響,所以幾乎能完全過濾掉階躍脈衝噪聲。而均值濾波處理階躍值時分配權重不會變化,那麼求平均值時受階躍值影響而產生的誤差就較大,因此效果不理想。
- 高斯噪聲是圖像中每個像素點都從原灰度值根據高斯分佈做隨機噪聲,那麼選取中值的代表意義並不大,因爲各個像素都是獨立同分布的。中值濾波相當於在模版內再選出了一個經過高斯噪聲變換後的灰度值,濾波效果和噪聲圖像沒有明顯改善,所以比較之下均值濾波較優。