【圖像處理筆記】銳化空間濾波器

銳化處理的主要目的是突出灰度的過渡部分。補償輪廓,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰。

圖像銳化的用途多種多樣,應用範圍從電子印刷和醫學成像到工業檢測和軍事系統的制導等。

圖像的模糊可以通過積分來實現(均值處理與積分類似)。而圖像銳化,則需要微分來實現。

下面的內容,我們將討論由數字微分來定義和實現銳化算子的方法。

圖像的一階微分二階微分

基本上。微分算子的響應程度與圖像在用算子操作的這一點的突變程度成正比,這樣,圖像微分增強邊緣和其他突變(如噪聲),而削弱灰度變化緩慢的區域。

對於一維函數f(x),其一階微分的基本定義是差值。

這個公式是由泰勒級數推導出的。現在只須當作一個定義來接受即可。

其中,爲了與二維圖像函數f(x,y)的微分保持一致,我們使用了偏導符號。

對於二維函數,我們將沿着兩個空間軸處理偏微分。當函數中只有一個變量時,,對於二階微分,這也同樣成立。

我們將二階微分定義成如下差分:


eg。一段掃描線,下面是掃描線中的灰度值

數字圖像中的邊緣在灰度上常常類似於斜坡過渡,如上面的例子那樣,這樣會導致圖像的一階微分會產生較粗的邊緣,因爲沿着斜坡的積分非零。

另一方面,二階微分產生零分開的一個像素的雙邊緣。

由此可以得出結論,二階微分在增強細節方面要比一階微分好得多,這是一個適合銳化圖像的理想特性。

所以我們開始主要注意二階微分。下面,我們來考慮二維函數二階微分的實現以及在圖像銳化處理中的應用。

使用二階微分進行圖像銳化——拉普拉斯算子

基本方法是,先定義一個二階微分的離散公式,然後構造一個基於該公式的濾波器模板,然後再把該模板與原圖片卷積,從而實現銳化。

我們最關注的是一種各向同性的濾波器,這種濾波器的響應與濾波器作用的圖像的突變方向無關。也就是說,各向同性濾波器是旋轉不變的,即將原圖像旋轉之後進行濾波處理,與先對圖像濾波再旋轉的結果應該是相同的。


可以證明,最簡單的各向同性微分算子是拉普拉斯算子。

不同的算子對應了不同的求微分的方法。

一個二維圖像函數f(x,y)的拉普拉斯算子定義爲

因爲任意階微分都是線性操作,所以拉普拉斯變換也是一個線性算子。爲了從離散形式描述這一公式,我們使用二階微分的公式來進行推導:


eg。濾波器模板如下:

這個濾波器可以實現拉普拉斯算子,這個模板給出了以90°爲增量進行旋轉的一個各向同性結果。

但其實對角線方向也可以這樣組成:在數字拉普拉斯變換的定義中,在左邊加入兩項,即兩個對角線方向各加上一個。每個新添加項的形式與類似,只是其座標軸的方向沿着對角線的方向。

由於每個對角線方向上的項還包含一個 -2f(x,y),所以一共應該減去8個f(x,y)

將產生如下的模板:

這個模板對45°增幅的結果是各向同性的。

由於拉普拉斯是一種微分算子,因此其應用強調的是圖像中的灰度突變,並不強調灰度級緩慢變化的區域。

將原圖像和拉普拉斯圖像疊加在一起的簡單方法,可以復原背景特性並保持拉普拉斯銳化處理的效果。

如果所使用的模板定義有負的中心繫數,那麼必須將原圖像減去經拉普拉斯變換後的圖像,而不是加上他,從而得到銳化後的結果。

由於拉普拉斯圖像中即有正值又有負值,並且所有負值在顯示時都被修剪爲0,所以變換後的圖像大部分都是黑色的。

一個典型的標定拉普拉斯圖像的方法是對它的最小值加上一個新的替代0的最小值,然後將結果標定到整個灰度範圍[0,L - 1]內。


opencv實現:

	Mat abs, grad, dst;
	Mat srcImage = imread("M:/圖像處理實驗/女票/灰度圖.bmp");
	Laplacian(srcImage, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);
	//計算絕對值,並將結果轉化爲8位
	convertScaleAbs(dst, abs);
	imwrite("M:/圖像處理實驗/銳化空間濾波器/Laplacian.jpg", abs);
	addWeighted(abs, 1, srcImage, 1, 0, dst);
	imwrite("M:/圖像處理實驗/銳化空間濾波器/Laplacian疊加原圖.jpg", dst);

原圖


Laplacian後的結果


Laplacian疊加原圖的結果


非銳化掩蔽和高提升濾波

在印刷和出版界使用多年的圖像銳化處理過程是從原圖像中減去一幅非銳化(平滑過的)版本。這個稱爲非銳化掩蔽的處理過程由下列步驟組成:

①模糊原圖像

②從原圖像中減去模糊圖像(產生的差值圖像稱爲模板)

③將模板加到原圖像上。

另F(x,y)表示模糊圖像,非銳化掩蔽以公式形式描述如下。首先我們要先得到模板:

gmask(x,y)=f(x,y) - F(x,y)

然後在原圖像上加上該模板的一個權重部分:

g(x,y)= f(x,y) + k* gmask(x,y)

通常,我們會在上式中包含一個權重係數k(k>=0)。當k=1時,我們得到上面定義的非銳化掩蔽。當k>1時,該處理稱爲高提升濾波。當k<1時,則不強調非銳化模板的貢獻。

openCV實現:

	Mat srcImage = imread("M:/圖像處理實驗/女票/灰度圖.bmp");
	Mat mediaImage, dst;
	medianBlur(srcImage, mediaImage, 5);
	addWeighted(mediaImage, -1, srcImage, 2, 0, dst);
	imwrite("M:/圖像處理實驗/銳化空間濾波器/非銳化掩蔽.jpg", dst);

結果:


使用一階微分對(非線性)圖像銳化——梯度

圖像處理中的一階微分是用梯度幅值來實現的。對於函數f(x,y),f在座標(x,y)處的梯度定義爲二維列向量

該向量具有重要的幾何特性,即它指出了在位置(x,y)處f 的最大變化率的方向,它恰好可以反映圖像邊緣上的灰度變化。

可以把圖像看成二維離散函數,圖像梯度其實就是二維離散函數的求導。

向量的幅度值(長度)表示爲M(x,y),即

它是梯度向量方向變化率在(x,y)處的值。

M(x,y)是與原圖像大小相同的圖像,它是當x 和y 允許在f 中的所有像素位置變化時產生的。在實踐中,該圖像通常稱爲梯度圖像(或梯度)。

因爲梯度向量的分量是微分,所以它們是線性算子。然而,該向量的幅度不是線性算子,因爲求幅度是做平方和平方根操作。

另一方面,上面定義的梯度不是旋轉不變的(各向異性),而梯度向量的幅度是旋轉不變的,也就是各向同性。

在某些實現中,用絕對值來近似平方和平方根的操作更適合於計算

該表達式仍保留了灰度的相對變化,但是通常各向同性特性丟失了。然而,就像之前的拉普拉斯變換那樣,在下面定義的離散梯度的各向同性僅僅在有限旋轉增量的情況下被保留了,它依賴於所使用的近似微分的濾波器模板。


正如前面拉普拉斯情況下的那樣,我們先對前面的公式定義一個離散的近似值,並由此形成合適的濾波器模板。

爲了簡化下面的討論,我們先另中心點Z5表示任意位置(x,y)處的f(x,y),Z1表示f(x-1,y-1)

在早期的數字圖像處理研究中,由Roberts提出的兩個定義使用的是交叉差分:

gx = (Z9 - Z5)和 gy = (Z8 - Z6)

我們計算梯度圖像爲:

M(x,y) = [ (Z9 - Z5)^2 + (Z8 - Z6)^2 ] ≈ |gx| + |gy| = |Z9 - Z5| + |Z8 - Z6|

式中所需的偏微分項,可以用如下的兩個濾波器模板來實現

這兩個模板稱爲羅伯特交叉梯度算子。

用羅伯特梯度算子運算的實質就是交叉地求對角線方向像素灰度差的和。

eg。

Roberts微分算子,模板小,計算量小;但是由於模板的尺寸是2*2的,待處理的像素不能放在模板的中心,不方便計算。

我們感興趣的最小模板是3*3的。

所以我們把Roberts算子改造成了一個3*3的模板,提出了以下的計算方法:

用以下模板可以實現上式

這兩個模板稱爲Soble算子。中心繫數使用權重2的思想是通過突出中心點的作用而達到平滑的目的。所有的模板中的係數和爲零,這正如微分算子的期望值那樣,表明灰度恆定區域的響應爲0。

Soble主要是一個用於邊緣檢測的離散微分算子。它結合了高斯平滑和微分求導,被廣泛用來計算圖像灰度函數的近似梯度。

梯度處理常用於工業檢測,不是輔助人工檢測產品的缺陷,就是更爲通用地作爲自動檢測的預處理。

	using namespace cv;
	Mat grad_x,grad_y;
	Mat abs_grad_x, abs_grad_y, dst;
	Mat srcImage = imread("M:/圖像處理實驗/女票/灰度圖.bmp");
	Sobel(srcImage, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
	convertScaleAbs(grad_x, abs_grad_x);
	Sobel(srcImage, grad_y, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
	convertScaleAbs(grad_y, abs_grad_y);
	imwrite("M:/圖像處理實驗/銳化空間濾波器/X方向Sobel.jpg", grad_x);
	imwrite("M:/圖像處理實驗/銳化空間濾波器/Y方向Sobel.jpg", grad_y);
	//計算數組加權和
	addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
	imwrite("M:/圖像處理實驗/銳化空間濾波器/整體Sobel.jpg", dst);
	addWeighted(dst, 1, srcImage, 1, 0, dst);
	imwrite("M:/圖像處理實驗/銳化空間濾波器/整體Sobel疊加原圖.jpg", dst);
原圖


Sobel後的結果

x軸


y軸


整體


疊加原圖後的結果


居然把女票給處理成這個樣子。。O(∩_∩)O哈哈~

這也證明了前面的一個結論,二階微分在增強細節方面要比一階微分好得多。確實,實現二階微分的拉普拉斯算子實現的銳化效果要比實現一階微分的Soble算子的銳化效果要好~


以上就是銳化空間濾波器的一些知識的推導和總結~

美好是因爲相信!加油~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章