數字影象處理之空間域濾波和銳化(Octave實現)
濾波這一概念可以結合數字訊號處理這一領域中的濾波。而在數字影象處理中濾波可以分為空間域濾波和頻率域濾波。這篇博文主要來學習下空間域濾波。
空間域濾波機理
*空間濾波器由一個鄰域(典型的是一個較小的矩形)構成,對該鄰域所包圍的畫素按照一定的操作計算出目標畫素的值,這一過程就是空間濾波器的工作機理*
例如:
假設有一個這樣的3*3的濾波器(每個元素代表權值
用T對下圖進行濾波,其覆蓋的第一個方塊為紅色的方框,對應元素相乘後結果求和,然後再求平均值(除以9),得出圓圈的畫素。(這就是後邊實現的均值濾波器)
空間相關與卷積
這裡只是簡單提一下這兩個概念。
相關:濾波器位移過影象並計算每個位置乘積之後的處理
卷積:和相關相似,只是濾波器要先旋轉
線性濾波器和非線性濾波器
概念:線性濾波器是指對畫素進行線性操作;否則則稱為非線性濾波器。
你可能問,什麼是線性操作呢?線性操作簡單來說就是滿足下面式子的操作:
均值濾波器就是一個典型的線性濾波器。
中值濾波器是一個典型的非線性濾波器。
平滑線性濾波器
平滑線性濾波器的主要作用是模糊處理和降低噪聲。例如在提取影象的最大目標時,需要先進行模糊處理來降低噪聲。然後增強某一閾值之上的灰度,來突出”亮”的部分。
以上
說了這麼多,我們來實現一個簡單的均值濾波器。
function [Image] = fliter (img, type)
%初始化濾波器模板
f = ones(3,3);
[x,y] = size(img);
Image = zeros(x,y);
%注意由於我們是3*3的濾波器,對第一個畫素img(1,1)濾波時,濾波器會有
%一部分在影象外部,所以我們要初始一個帶著一圈0的殼的影象
temp = zeros(x+2,y+2);
%把中間的部分賦值原來的數值
temp(2:x+1,2:y+1) = img;
for i=2:x+1
for j=2:y+1
%計算均值
Image(i-1,j-1) = mean(mean(f.*temp(i-1:i+1,j-1:j+1))');
end;
end;
endfunction
統計排序(非線性)濾波器
由名字可知,這是基於數理統計的一種濾波器,採用的是非線性的計算。
中值濾波器
他是將鄰域中的灰度值排序,然後取中值作為替換中心元素的灰度值。例如:3*3的中值濾波器,取排序後的第5個元素。
實現程式碼:
function [Image] = medianFliter (img)
[x,y] = size(img);
Image = zeros(x,y);
temp = zeros(x+2,y+2);
%同上面均值濾波的作用
temp(2:x+1,2:y+1) = img;
for i=1:x
for j=1:y
t = temp(i:i+2,j:j+2);
%median為求中值函式,需要將t轉化為一個列向量
Image(i,j) = median(t(:));
end;
end;
endfunction
在原圖中增加了椒鹽噪聲,可以看到,中值濾波後椒鹽噪聲基本被去除。
銳化空間濾波器
銳化:即增強影象中的邊緣部分。邊緣部分一般為灰度激變的部分。有photoshop的可以去試一下帶的銳化功能。
準備知識
我們學習過高等數學中的積分和微分,別方,我儘量解釋的容易理解一點同時也儘量準確點(說實話,讓我正確的解釋積分和微分我估計也解釋不清楚)。
積分我們可以簡單的理解為求和
一次函式積分不就是就其與
微分我們可以簡單的理解為求導
一階微分(一階求導):我們高中就知道函式的一階導數顯示了函式斜率。斜率決定了函式變化的快慢。
二階微分(二階求(偏)導):二階求導就是在一階的基礎上繼續求導。一階導數也是一個函式的話,二階求導可以理解為斜率變化的快慢。
通過下面這個圖可以看出對於灰度激變影象,一階和二階的表現:
可以看出二階對激變的時刻更加敏感。
知道來這些怎麼對離散的灰度微分(求導)呢?
一階微分:我們定義為兩個畫素之間的差值
二階微分
下面我們就正式開始進行影象銳化
這裡我們採用二階微分進行銳化先
這裡有一個概念各向同性濾波器。它就是旋轉圖片後濾波結果仍然相同,與影象的突變方向無關。最為簡單的各向同性微分運算元是拉普拉斯運算元。一個二維影象函式
我們可以定義為這樣的模板
這樣計算出一個影象的邊界影象Temp,與原影象相加(相減),得到銳化的結果。(注意:邊界影象中會有些部分小於0,我們要通過下面操作把他們置為0)
temp(temp<0) = 0;
最終表示式為:
當採用上邊