注:本系列來自於圖像處理課程實驗,用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)平滑結果展示
以下是椒鹽噪聲的去除效果,中值濾波的效果更優:
以下是高斯噪聲的去除效果,均值濾波的效果更優:
(2)討論
這里並沒有數學理論的數學分析。也沒有給出樣例。僅僅是從直觀理解角度簡要分析:
- 中值濾波去除椒鹽效果更好。由於椒鹽噪聲是階躍脈沖噪聲(取值0或255且小概率出現),中值濾波是去中位數,不會被階躍值影響,所以差點兒能全然過濾掉階躍脈沖噪聲。
而均值濾波處理階躍值時分配權重不會變化。那么求平均值時受階躍值影響而產生的誤差就較大。因此效果不理想。
- 高斯噪聲是圖像中每一個像素點都從原灰度值依據高斯分布做隨機噪聲。那么選取中值的代表意義並不大,由於各個像素都是獨立同分布的。中值濾波相當於在模版內再選出了一個經過高斯噪聲變換后的灰度值,濾波效果和噪聲圖像沒有明顯改善,所以比較之下均值濾波較優。