1. 程式人生 > >數字影象處理之空間域濾波和銳化(Octave實現)

數字影象處理之空間域濾波和銳化(Octave實現)

濾波這一概念可以結合數字訊號處理這一領域中的濾波。而在數字影象處理中濾波可以分為空間域濾波和頻率域濾波。這篇博文主要來學習下空間域濾波。

空間域濾波機理

  *空間濾波器由一個鄰域(典型的是一個較小的矩形)構成,對該鄰域所包圍的畫素按照一定的操作計算出目標畫素的值,這一過程就是空間濾波器的工作機理*

例如:
假設有一個這樣的3*3的濾波器(每個元素代表權值 w )

T=111111111

用T對下圖進行濾波,其覆蓋的第一個方塊為紅色的方框,對應元素相乘後結果求和,然後再求平均值(除以9),得出圓圈的畫素。(這就是後邊實現的均值濾波器)

空間相關與卷積

這裡只是簡單提一下這兩個概念。

相關:濾波器位移過影象並計算每個位置乘積之後的處理
卷積:和相關相似,只是濾波器要先旋轉 180°

線性濾波器和非線性濾波器

概念:線性濾波器是指對畫素進行線性操作;否則則稱為非線性濾波器。

你可能問,什麼是線性操作呢?線性操作簡單來說就是滿足下面式子的操作:

f(x+y)=f(x)+f
(y)
f(ax)=af(x)

均值濾波器就是一個典型的線性濾波器。
中值濾波器是一個典型的非線性濾波器。

平滑線性濾波器

平滑線性濾波器的主要作用是模糊處理和降低噪聲。例如在提取影象的最大目標時,需要先進行模糊處理來降低噪聲。然後增強某一閾值之上的灰度,來突出”亮”的部分。

T1=111111111T2=121242121

以上 T1 為簡單的均值濾波器, T2 為帶權值的均值濾波器。後者更為重要些。
說了這麼多,我們來實現一個簡單的均值濾波器。

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的可以去試一下帶的銳化功能。

準備知識

我們學習過高等數學中的積分和微分,別方,我儘量解釋的容易理解一點同時也儘量準確點(說實話,讓我正確的解釋積分和微分我估計也解釋不清楚)。

積分我們可以簡單的理解為求和

一次函式積分不就是就其與 x 軸所圍面積的和嗎?雖然有正負。那我們的均值濾波器可以思考下其實也是積分的原理,是離散的積分,計算出他們的乘積和,只不過最後又平均了一下。

微分我們可以簡單的理解為求導

一階微分(一階求導):我們高中就知道函式的一階導數顯示了函式斜率。斜率決定了函式變化的快慢。
二階微分(二階求(偏)導):二階求導就是在一階的基礎上繼續求導。一階導數也是一個函式的話,二階求導可以理解為斜率變化的快慢。

通過下面這個圖可以看出對於灰度激變影象,一階和二階的表現:
這裡寫圖片描述
可以看出二階對激變的時刻更加敏感。

知道來這些怎麼對離散的灰度微分(求導)呢?

一階微分:我們定義為兩個畫素之間的差值

fx=f(x+1)f(x)

二階微分

2f2x=f(x+1)xf(x)x=f(x+1)+f(x1)2f(x)

下面我們就正式開始進行影象銳化

這裡我們採用二階微分進行銳化先

這裡有一個概念各向同性濾波器。它就是旋轉圖片後濾波結果仍然相同,與影象的突變方向無關。最為簡單的各向同性微分運算元是拉普拉斯運算元。一個二維影象函式 f(x,y) 的拉普拉斯運算元定義為:

2f=2fx2+2fy2=f(x+1,y)+f(x1,y)2f(x,y)+f(x,y+1)+f(x,y1)2f(x,y)
我們可以定義為這樣的模板
T3=010141010
T4=111181111
T5=010141010
T6=111181111

這樣計算出一個影象的邊界影象Temp,與原影象相加(相減),得到銳化的結果。(注意:邊界影象中會有些部分小於0,我們要通過下面操作把他們置為0)

temp(temp<0) = 0;

最終表示式為:

g(x,y)=f(x,y)+c[2f(x,y)]
當採用上邊 T3T4