圖像增強之空間域銳化


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('加權二階濾波');

二階濾波比之前的一階濾波銳化程度更加強烈,留下了非常清晰的邊緣圖案。w1w2濾波的方向性不明顯圖像基本一致,僅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、參考文獻

1MATLAB--數字圖像處理 圖像銳化(原理篇)

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

2imsharpen

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

3、《數字圖像處理與機器視覺》

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

 

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM