2.2二阶微分算子
2.2.1Laplacian算子
拉普拉斯二阶零交叉(zerocross)算子是利用边缘点处二阶导函数出现零交叉原理来检测边缘。
函数
的拉普拉斯算子公式为:
使用差分方程对x和y方向上的二阶偏导数近似如下:
这一近似式是以点[i,j+1]为中心的。
用j-1替换j,得到以点[i,j]为中心的二阶偏导数的理想近似式:
(1)
类似地,可得:
(2)
把
(1)、
(2)式合并可得能用来近似表达拉普拉斯算子的模板:
当拉普拉斯算子输出出现过零点时就表明有边缘存在,其中忽略无意义的过零点(均匀零区)。
原则上,过零点的位置精度可以通过线性内插方法精确到子像素的分辨率,不过由于噪声,结果可能不会很精确。
拉普拉斯算子不具方向性,对灰度突变敏感,定位精度较高,同时,对噪声也敏感。
Laplacian算子一般不以其原始形式用于边缘检测。
2.2.2LOG算子
正如上面所提到的,利用图像强度二阶导数的零交叉点来求边缘点的算法对噪声十分敏感,所以,希望在边缘增强前滤除噪声。
将高斯滤波器和拉普拉斯零交叉算子结合在一起就形成了Log算子。
Log算子实现的方式有两种:
一种是图像先与高斯滤波器进行卷积,再求卷积的拉普拉斯变换;另一种是先求高斯滤波器的拉普拉斯变换,再求与图像的卷积。
Log边缘检测器的基本特征是:
①平滑滤波器是高斯滤波器;②增强步骤采用二阶导数(二维拉普拉斯函数);③边缘检测判据是二阶导数零交叉点并对应一阶导数的较大峰值;④使用线性内插方法在子像素分辨率水平上估计边缘的位置。
Log算子的输出可通过卷积运算得到:
根据卷积求导法有:
其中,
Log算子法既平滑了图像又降低了噪声,由于平滑会导致边缘的延展,因此边缘检测器只考虑那些具有局部梯度最大值的点为边缘点,这一点可以用二阶导数的零交叉点来实现。
为了避免检测出非显著边缘,选择一阶导数大于某一阈值的零交叉点作为边缘点。
3MATLAB仿真
MATLAB图像处理工具中有多种边缘检测算子函数,利用MATLABedge函数,得以下实验结果:
针对图片细节少的rice图片,结果如下:
针对细节较多的camera图,程序运行结果如下:
各算子的MATLAB检测函数均未带滤波器,阈值为观察到检测结果为最优的阈值。
从以上可以看出,Prewitt算子和Sobel算子具有平滑作用,但定位精度不高。
Roberts算子定位比较精确,但没有平滑作用。
Log算子具有平滑作用,但边缘有所展宽。
Canny算子检测精度较高,具有平滑作用,去噪能力强,检测效果为最好。
改进Sobel算子比经典Soble算子检测的边缘更加精细;抗噪能力较强,克服了Sobel算子对噪声极其敏感的缺点。
具有提取的边缘精细、抗噪能力强等优点,是一种简单有效的边缘检测算法。
4结束语
根据以上实验和算法分析可得,Roberts,Sobel和Prewitt算子的算法较为简单,容易实现,运算速度较快,对噪声敏感,可用于车牌号码识别、流水线上产品检测、电视节目字幕检测等对识别速度要求较高而对精度要求不高的地方。
Log算子的算法稍微复杂一些,其检测效果好于Roberts,Sobel和Prewitt算子,可用于答卷识别、邮政分捡等对识别速度和精度都有一定要求的地方。
改进的Sobel梯度边缘检测算法,虽然运行时间较原算法多一些,但是它克服了sobel算子进行边缘检测存在边缘粗糙、对噪声敏感的缺点,具有提取的边缘精细、抗噪能力强等优点,是一种简单有效的边缘检测算法。
Canny算子算法最为复杂,但其检测效果为最好,可用于医学识别、遥测等对速度要求不高而对精度要求较高的地方。
在应用中,应根据实际情况选择不同的微分算子。
参考文献:
[1]张凯丽,刘辉.边缘检测技术的发展研究[J].昆明理工大学学报,2000,5(25).
[2]郝文化,田蕾,董秀芳,等.MATLAB图形图像处理应用教
程[M].中国水利水电出版社,2004.
[3]RafaelC.GonzalezRichardE.Woods著.阮秋琦阮宇智等译.DigitalImageProcessing[M].电子工业出版社,2003
[4]JohnCanny,Member,IEEE.AComputationalApproachtoEdgeDetection[J].PatternAnalysisandMachineIntelligence,November1986,PA-MI-8
(1):
679-697.
[5]MitraBasu,Gaussian-basededge-detectionmethods-asurvey[J].Systems,ManandCybernetics,PartC,IEEETransactionsonAug.2002,32(3):
252-260.
[6]林卉,赵长胜,舒宁.基于Canny算子的边缘检测及评价[J].黑
龙江工程学院学报,2003,2(17).
附:
1、matlab边缘检测程序
(rice图像):
I1=imread('rice.tif');
I=rgb2gray(I1);
a=edge(I,'roberts');
b=edge(I,'sobel');
c=edge(I,'prewitt');
d=edge(I,'log');
e=edge(I,'canny');%canny用于细节较多的图像时,可以规定门限值去掉弱边缘
imwrite(a,'roberts.tif');
imwrite(b,'sobe1.tif');
imwrite(c,'prewitt.tif');
imwrite(d,'log.tif');
imwrite(e,'canny.tif');
figure(5),imshow(a);
title('roberts');
figure(6),imshow(b);
title('sobel');
figure(7),imshow(c);
title('prewitt');
figure(8),imshow(d);
title('log');
figure(9),imshow(e);
title('canny');
(camera图像):
I1=imread('camera.tif');
I=rgb2gray(I1);
a=edge(I,'roberts');
b=edge(I,'sobel');
c=edge(I,'prewitt');
d=edge(I,'log');
e=edge(I,'canny',[00.18]);%带阈值范围,去掉0-0.18阈值范围边缘
imwrite(a,'roberts.tif');
imwrite(b,'sobe1.tif');
imwrite(c,'prewitt.tif');
imwrite(d,'log.tif');
imwrite(e,'canny.tif');
figure(5),imshow(a);
title('roberts');
figure(6),imshow(b);
title('sobel');
figure(7),imshow(c);
title('prewitt');
figure(8),imshow(d);
title('log');
figure(9),imshow(e);
title('canny');
改进Sobel程序(matlab):
clc
clearall%清除全局变量
closeall%关闭所有窗口
A1=imread('camera.jpg');%读入原图
figure
(1),imshow(A1);%显示原图
title('原图:
');
A2=rgb2gray(A1);%转为灰度图像
[m1n1]=size(A2);%获取图像宽度和长度%%%%%%中值滤波5X5矩形窗口%%%%%
A3=A2;
a=A3;
fori=3:
m1-2
forj=3:
n1-2
A3=A2(i-2:
i+2,j-2:
j+2);
B=sort(A3(:
));
a(i,j)=B(13);
end
end
A=histeq(a);%滤波后的直方图图像
figure
(2),imshow(A);
title('滤波后的直方图:
');
%四个方向模板
mask1=[230-3-2;340-4-3;660-6-6;340-4-3;230-3-2];
mask2=[23632;34643;00000;-3-4-6-4-3;-2-3-6-3-2];
mask3=[0-2-3-2-6;20-4-6-2;340-4-3;2640-2;62320];
mask4=[-6-2-3-20;-2-6-402;-3-4042;-20462;02326];
I=im2double(A1);
d1=imfilter(I,mask1);
d2=imfilter(I,mask2);
d3=imfilter(I,mask3);
d4=imfilter(I,mask4);
dd=max(abs(d1),abs(d2));%取四种模板的最大灰度值组成图像dd
dd=max(dd,abs(d3));
dd=max(dd,abs(d4));
[m,n]=size(dd);
s=dd;
fori=2:
m-1%细化处理
forj=2:
n-1
s(i,j)=dd(i,j);
q=max(s(i-1,j-1),s(i,j-1));%将8领域的最大灰度值赋予q
q=max(q,s(i+1,j-1));
q=max(q,s(i-1,j));
q=max(q,s(i,j));
q=max(q,s(i+1,j));
q=max(q,s(i-1,j+1));
q=max(q,s(i,j+1));
q=max(q,s(i+1,j+1));
ifs(i,j)>(0.8*q)%
s(i,j)=q;
else
s(i,j)=0;
end
end
end
grad=mat2gray(dd);
%level=graythresh(grad);
BW=im2bw(grad,0.17647);
%figure,imshow(dd);
figure(3),imshow(BW);
title('未经细化处理的改进sobel边缘检测:
')
%figure,imshow(s);
%title('123')
grad=mat2gray(s);
%level=graythresh(grad);
BW1=im2bw(grad,0.3);%设定门限值为0.22
figure(4),imshow(BW1);
title('细化处理后改进Sobel算法边缘检测:
')