影象增強之空間域銳化
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