注:本系列來自於圖像處理課程實驗,用Matlab實現最主要的圖像處理算法算法
本文章是Matlab圖像處理系列的第二篇文章。介紹了空間域圖像處理最主要的概念————模版和濾波器,給出了均值濾波起和中值濾波器的Matlab實現。最後簡要討論去躁效果。bash
圖像處理中。模版可以看做是n*n(n一般是奇數)的窗體。模版連續地運動於整個圖像中,對模版窗體範圍內的像素作相應處理。markdown
模版運算主要分爲:函數
模版卷積是把模版內像素的灰度值和模版中相應的灰度值相乘,求平均值賦給當前模版窗體的中心像素。做爲它的灰度值;性能
模版排序是把模版內像素的灰度值排序,取某個順序統計量做爲模版中心像素灰度值。優化
Matlab中作模版卷積十分高效,取出模版內子矩陣和模版權重點乘求平均就能夠ui
咱們很是easy想到模版的中心點是邊界的特殊狀況。處理邊界有很是多種作法:spa
忽略邊界是模版直接在非邊界點運動操做,直接忽略這些邊界點。這麼作的優勢固然是效率高,比較適合圖像尺寸較大或人們感興趣部分不在圖像邊緣的狀況;code
外插邊界顧名思義就是補齊邊界點做爲模版中心時缺失的像素部分,可以賦予補邊像素必定的灰度值並做計算。優勢在於不犧牲性能的狀況下,對邊界進行了處理。但是補邊像素的灰度值設定勢必致使邊界的像素點的不連貫性,嚴重狀況下致使失真;排序
改變模版領域是指在邊界處理中改變模版窗體的大小,爲邊界作特殊處理,如3*3
模版在處理最左上角像素點時僅僅考慮圖像內點2*2
的模版運算。這樣爲邊界特殊考慮既不失真又沒有忽略不論什麼像素點。但是在推斷邊界時勢必會產生必定的開銷。稍微會影響圖像處理的性能(可以分狀況寫,在犧牲程序複雜度的狀況下彌補推斷帶來的開銷)。
不論什麼的邊界處理都不是完美的,都在必定程度上又一次分配了模版權重。
把模版運算運用於圖像的空間域加強的技術稱爲空間域濾波。依據濾波頻率空間域濾波分爲平滑濾波(減弱和去除高頻份量)和銳化濾波(減弱和去除低頻份量),依據濾波計算特色又分爲線性濾波和非線性濾波。
所以空間域濾波可分爲:
分類 | 線性 | 非線性 |
---|---|---|
平滑 | 線性平滑 | 非線性平滑 |
銳化 | 線性銳化 | 非線性銳化 |
領域均值濾波顧名思義是就是求模版內像素點灰度的均值。是最經典的線性平滑濾波。空域濾波常用於去除加性噪聲,一般把濾波算法封裝的模塊稱做濾波器。
均值濾波的模版就是ones(n, n)
,模版內所有元素均是一,即他們的權重如出一轍。
其它常用的線性濾波還有:
先調用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
函數求均值,淡化了模版卷積的概念(後面邊緣檢測中會顯式地作模版卷積)。
中值濾波選取模版中像素灰度值的中位數賦給模版中心像素,是經典的非線性平滑濾波。
理想狀況下,中值濾波的椒鹽去噪效果優於均值濾波。是因爲它能有效的消除孤立階躍脈衝噪聲。後面將比較分析。
2-D中值濾波也可以選取各類各樣的模版,我在這裏就選取最簡單的8-領域模版作演示。
相同我檢測邊界。作特殊處理:
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函數實現方式,若是它是一個平方量級的算法,那麼咱們有如下兩種優化方式,來提高中值濾波的速度:
如下是椒鹽噪聲的去除效果,中值濾波的效果更優:
如下是高斯噪聲的去除效果,均值濾波的效果更優:
這裏並無數學理論的數學分析。也沒有給出樣例。僅僅是從直觀理解角度簡要分析:
而均值濾波處理階躍值時分配權重不會變化。那麼求平均值時受階躍值影響而產生的偏差就較大。所以效果不理想。