在圖像增強中,平滑是為了消除圖像中噪聲的干擾,或者降低對比度,與之相反,有時為了強調圖像的邊緣和細節,需要對圖像進行銳化,提高對比度。
圖的邊緣是指在局部不連續的特征。
簡要介紹一下原理:
拉普拉斯銳化圖像是根據圖像某個像素的周圍像素到此像素的突變程度有關,也就是說它的依據是圖像像素的變化程度。我們知道,一個函數的一階微分描述了函數圖像是朝哪里變化的,即增長或者降低;而二階微分描述的則是圖像變化的速度,急劇增長下降還是平緩的增長下降。那么據此我們可以猜測出依據二階微分能夠找到圖像的色素的過渡程度,例如白色到黑色的過渡就是比較急劇的。
或者用官方點的話說:當鄰域中心像素灰度低於它所在的領域內其它像素的平均灰度時,此中心像素的灰度應被進一步降低,當鄰域中心像素灰度高於它所在的鄰域內其它像素的平均灰度時,此中心像素的灰度應被進一步提高,以此實現圖像的銳化處理。
應用:
運用拉普拉斯可以增強圖像的細節,找到圖像的邊緣。但是有時候會把噪音也給增強了,那么可以在銳化前對圖像進行平滑處理。
下面我們來推導二階微分與像素的關系:
先看一階偏微分和推出的二元函數微分:
一階微分法能夠用來檢測邊緣是否存在。
那么二階微分法,也就是拉普拉斯算子就可以確定邊緣的位置。(有的文章中稱下式為拉普拉斯掩膜中心系數)
這樣可以找到一個模板矩陣:
這個成為四鄰域也就是上面的二階微分法
這個是八鄰域。
【注】從上面的兩種模板中就可以看出,如果一個黑色平面中有一個白點,那么模板矩陣可以使這個白點更亮。由於圖像邊緣就是灰度發生跳變的區域,所以拉普拉斯模板對邊緣檢測很有用。
八鄰域的表示法為:
將算得的值替換原(x,y)處的像素值,可以得到類似邊界的地方,然后根據下式得到銳化圖像:
注:上述文字及圖片引用自:http://blog.csdn.net/zb1165048017/article/details/49330171 (博主寫的很用心!orz)
這里貼上筆者的拉普拉斯代碼:
1 a=imread('yue.jpg'); 2 a=rgb2gray(a); 3 %figure,imshow(a); 4 c=[443 602]; 5 c=a; 6 for j=2:601 7 c(1,j)=a(1,j-1); 8 c(443,j)=a(441,j-1); 9 end 10 for i=2:442 11 c(i,1)=a(i-1,1); 12 c(i,602)=a(i-1,600); 13 end 14 subplot(1,2,1); 15 imshow(c); 16 for i=2:442 17 for j=2:601 18 lpls=8*c(i,j)-c(i-1,j-1)-c(i-1,j+1)-c(i+1,j-1)-c(i+1,j+1)-c(i-1,j)-c(i+1,j)-c(i,j-1)-c(i,j+1); 19 if lpls<0 20 a(i-1,j-1)=a(i-1,j-1)-lpls; %加上a(i-1,j-1),就是拉普拉斯增強濾波器。 21 else 22 a(i-1,j-1)=a(i-1,j-1)+lpls; 23 end 24 end 25 end 26 subplot(1,2,2); 27 imshow(a);
黑白圖左邊為未處理的原圖,黑白圖右邊的為已處理的圖片。
上述為拉普拉斯濾波器。屬於線性空間濾波器。
下面講述非線性空間濾波器:
主要是排序濾波器
比如 :最大值濾波器、最小值濾波器、中值濾波器。
其中中值濾波器要注意的一個就是要濾波器的m*n必須為奇數!
本次對最大值濾波器的實現進行試驗:
最大值濾波器顧名思義就是在 f(x,y) 的領域中用最大的像素值代替 f(x,y) 的像素值。
有了拉普拉斯濾波器構造的經驗,我們很容易就寫出最大值濾波器的代碼
ps:為了使最大值濾波器的效果更直觀,我們用一張加了高斯噪聲的圖片來測試。
代碼:
1 a=zeros(500,600); 2 a=imnoise(a,'gaussian',0,0.03); %將均值0,方差為0.03的高斯噪聲加到圖像a上 3 subplot(1,3,1); 4 imshow(a); 5 %中值濾波器,調用medfilt函數。 6 b=medfilt2(a,[3,3]); 7 subplot(1,3,2); 8 imshow(b); 9 %最大值濾波器,具體實現原理操作如下。 10 c=[502 602]; 11 c=a; 12 for j=2:601 13 c(1,j)=a(1,j-1); 14 c(502,j)=a(500,j-1); 15 end 16 for i=2:501 17 c(i,1)=a(i-1,1); 18 c(i,602)=a(i-1,600); 19 end 20 for i=2:501 21 for j=2:601 22 mx=c(i,j); 23 for x=-1:1 24 for y=-1:1 25 if mx<c(i+x,j+y) 26 mx=c(i+x,j+y); 27 else continue; 28 end 29 end 30 end 31 a(i-1,j-1)=mx; 32 end 33 end 34 subplot(1,3,3); 35 imshow(a);
左邊為初始圖片,中間為中值濾波器濾波后的圖像,右邊為最大值濾波器濾波后的圖片。
我們很明顯的看到右圖噪聲放大了,中間的圖片噪聲大大減弱。
如果我們是白底黑色的噪聲。那么最大值濾波器會過濾噪聲。在這里就不繼續試驗了。
中值濾波器,它能濾波椒鹽噪聲、高斯噪聲等,並且相對於均值濾波器來說,它不僅能過濾噪聲,而且還不會模糊邊界,保護了圖像尖銳的邊緣。
均值濾波器
均值濾波器也是可以去除噪聲比較好的一種方法,是把每個像素都用周圍的8個像素來做均值操作,幅值近似相等且隨機分布在不同位置上,這樣可以平滑圖像,速度較快,算法簡單。但是無法去掉噪聲,只能微弱的減弱它。
具體實現代碼如下:
(ps:我不知道為什么循環寫不行,我發現賦給每個像素點的最大值是28,在原圖像中明明可以找到比這更大的像素點,但是不知道為什么賦不了,問題仍待解決中,有知道的可以在評論區留言,謝謝~)
1 a=imread('diqiu.jpg'); 2 %subplot(1,3,1); 3 %imshow(a); 4 a=rgb2gray(a); 5 c=filter2(fspecial('average',3),a)/255; 6 % for i=2 : 1199 7 % for j=2 : 1071 8 % sum=0; 9 % for n=-1 : 1 10 % for m=-1 :1 11 % sum=sum+a(i+n ,j+m); 12 % end 13 % end 14 % c(i , j)=sum/9; 15 % end 16 % end 17 subplot(1,2,2); 18 imshow(c); 19 subplot(1,2,1); 20 imshow(a);
效果圖:
梯度算子銳化濾波器
梯度算子銳化濾波器有三種,分別是:Soble算子、Roberts算子、Prewitt算子。
上課沒有認真聽,先把別人將的貼過來:http://blog.csdn.net/tonyshengtan
http://blog.csdn.net/u012808193/article/details/45722283
上述的三個梯度算子是圖像邊緣檢測的經典算子
代碼:
a=imread('diqiu.jpg'); a=rgb2gray(a); figure,imshow(a); a=double(a); sobel=edge(a,'Sobel'); roberts=edge(a,'Roberts'); prewitt=edge(a,'Prewitt'); figure,imshow(sobel), title('sobel'); figure,imshow(roberts),title('roberts'); figure,imshow(prewitt),title('prewitt');
效果圖:
效果圖符合我們預期的效果,即原圖像的大部分邊界都提取出來了!