1. 程式人生 > >影象增強之空間域銳化

影象增強之空間域銳化

1、影象銳化理論

影象銳化的目的是使影象變得清晰起來,銳化主要用於增強影象的灰度跳變部分,這一點與影象平滑對灰度跳變的抑制正好相反。銳化提高影象的高頻分量,增加灰度反差增強影象的邊緣和輪廓,以便後期影象識別。

在影象增強過程中,常用平滑演算法來消除噪聲,平滑屬於低通濾波,影象的能量主要集中在低頻部分,噪聲所在頻段主要在高頻部分,同時影象的邊緣也集中在高頻部分,這意味著影象平滑後,高頻被衰減輪廓會出現模糊。影象銳化就是為了減少這種現象,通過高通濾波使影象邊緣和輪廓變得清晰。

2、一階微分影象增強--梯度運算元

其中:

梯度的方向就是函式f(x,y)最大變化率的方向。梯度的幅值作為最大變化率大小的度量,值為:  

離散的二維函式f(i,j),可以用有限差分作為梯度的一個近似值。

為了簡化計算,可以用絕對值來近似。

|▽f(i,j)|= |f(i+1,j)-f(i,j)| +|f(i,j+1)-f(i,j)|

2.1 Robert運算元

   |▽f(i,j)|= |f(i+1,j+1)-f(i,j)| +|f(i,j+1)-f(i+1,j)|

上面算式採用對角相差的差分法來代替微分,寫為濾波模板形式為:

其中w1對接近45°的邊緣有較強響應,w2對接近-45°的邊緣有較強響應。

imgPath = 'E:\opencv_pic\src_pic\pic6.bmp';
img = imread(imgPath);
img=rgb2gray(img);
w1 =[-1,0; 0,1];
w2 =[0,-1; 1, 0];
 
G1=imfilter(img, w1, 'corr', 'replicate');
G2=imfilter(img, w2, 'corr', 'replicate');
G=abs(G1)+abs(G2);
subplot(2,2,1),imshow(img), title('原始影象');
subplot(2,2,2),imshow(abs(G1)), title('w1影象');
subplot(2,2,3),imshow(abs(G2)),title('w2濾波');
subplot(2,2,4),imshow(G),title('Robert交叉梯度影象');

可見w1濾波後45°的邊緣被突出,w2濾波後-45°的邊緣被突出。Robert交叉濾波後全部邊緣突出顯示。

2.2 Sobel運算元

濾波時一般更多使用奇數尺寸的模板,下面是Sobel運算元。

imgPath = 'E:\opencv_pic\src_pic\pic6.bmp';
img = imread(imgPath);
img=rgb2gray(img);
 
 
w1 =[-1,-2,-1; 0,0,0;  1,2, 1];
w2 =[ -1,0,1;  -2,0,2; -1,0,1];
G1=imfilter(img, w1);
G2=imfilter(img, w2);
G=abs(G1)+abs(G2);
subplot(2,2,1),imshow(img), title('原始影象');
subplot(2,2,2),imshow(abs(G1)), title('w1影象');
subplot(2,2,3),imshow(abs(G2)),title('w2濾波');
subplot(2,2,4),imshow(G),title('Sobel交叉梯度影象');

同Robert運算元,w1濾波後45°的邊緣被突出,w2濾波後-45°的邊緣被突出。Sobel交叉濾波後全部邊緣突出顯示。

3、二階微分濾波--拉普拉斯運算元

二維函式f(x,y)在二階微分(拉普拉斯運算元)的定義為:

 

將上式相加後就得到拉普拉斯運算元:

對應的濾波模板如下:

考慮到求絕對值計算梯度,正負係數圖形的響應一樣,上面的模板也可以表示為:

上面的模板具有對稱性,所以求一次濾波就可以,不需要像一階微分那樣計算2次。

imgPath = 'E:\opencv_pic\src_pic\pic6.bmp';
img = imread(imgPath);
img=rgb2gray(img);
 
w1 =[0,1,0;  1,-4,1;   0,1,0];
w2 =[0,-1,0; -1,4,-1;  0,-1,0];
w3 =[1,4,1; 4,-20,4;  1,4,1];
G1=imfilter(img, w1, 'corr', 'replicate');
G2=imfilter(img, w2, 'corr', 'replicate');
G3=imfilter(img, w3, 'corr', 'replicate');

subplot(2,2,1),imshow(img,[]), title('原始影象');
subplot(2,2,2),imshow(abs(G1)), title('w1影象');
subplot(2,2,3),imshow(abs(G2)),title('w2濾波');
subplot(2,2,4),imshow(abs(G3)),title('加權二階濾波');

二階濾波比之前的一階濾波銳化程度更加強烈,留下了非常清晰的邊緣圖案。w1和w2濾波的方向性不明顯影象基本一致,僅w2濾波影象的輪廓更加深一些。

使用imsharpen對影象進行銳化,對銳化強度引數進行控制,可見太高的銳化強度導致影象出現“紋理”,效果變差。

b1=imsharpen(img,'Radius',1,'Amount',0.2);
b2=imsharpen(img,'Radius',1,'Amount',2);
b3=imsharpen(img,'Radius',1,'Amount',1);
subplot(1,4,1),imshow(img), title('原始影象');
subplot(1,4,2),imshow(b1), title('imsharpen影象1');
subplot(1,4,3),imshow(b2), title('imsharpen影象2');
subplot(1,4,4),imshow(b3), title('imsharpen影象3');

4、銳化影象後續處理

無論一階微分運算元還是二階微分運算元,各系數之和都為0,說明運算元在灰度恆定區域的響應為0,即銳化後的影象,在原圖比較平坦的區域幾乎都變為黑色,而在影象邊緣,灰度跳變點的細節被突出顯示。一般影象銳化是希望增強影象的邊緣和細節,而非將平滑區域的灰度資訊丟失。因此,可以用原影象加上銳化後的影象,得到比較理想的結果。

使用Sobel運算元銳化和matlab內建銳化函式銳化之後的影象對比,下圖是內建函式銳化結果:

b=imsharpen(img,'Radius',2,'Amount',1);
subplot(1,2,1),imshow(img), title('原始影象');
subplot(1,2,2),imshow(b), title('imsharpen影象');

imsharpen濾波影象明顯比運算元銳化的影象亮度更高,保留了原圖比較平坦的部分,比如背景圖部分。如果希望上面的濾波函式也達到這個效果,只需要把原圖加上濾波後的影象即可,係數是為了防止溢位,比如下面的例子。使用函式為imshow(G+0.7*img),title('Sobel交叉梯度影象')。

5、參考文獻

1、MATLAB--數字影象處理 影象銳化(原理篇)

https://www.csdn.net/gather_24/MtjaMg4sMjg1OS1ibG9n.html

2、imsharpen

https://ww2.mathworks.cn/help/images/ref/imsharpen.html

3、《數字影象處理與機器視覺》

第二版。 張錚、徐超、任淑霞、韓海玲等編著。

 

 尊重原創技術文章,轉載請註明。

https://www.cnblogs.com/pingwen/p/12275235.html