题目边缘检测算子的边缘提取及Hough变换学院:信息科学与技术学院专业:控制科学与工程学生:XX指导教师:XXX2014年12月14日11、边缘检测算子简介图像边缘(或边沿)是指周围像素灰度有阶跃性变化或“屋顶”变化的那些像素的集合。在图像处理中通过边缘算子能够较好的提取出数字图像的边缘,常用的边缘检测算子主要分为以下几类:一、基于一阶导数的边缘检测算子包括Roberts算子、Sobel算子、Prewitt算子、Kirsch算子等,在算法实现过程中,通过2x2(Roberts算子)或者3x3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。二、基于二阶导数的边缘检测算子,该算子对噪声敏感。一种是二阶微分的拉普拉斯边缘检测算子,另一种改进方式是先对图像进行平滑处理,然后再应用二阶导数的边缘检测算子,其代表是LOG算子。前边介绍的边缘检测算子法是基于微分方法的,其依据是图像的边缘对应一阶导数的极大值点和二阶导数的过零点。三、Canny边缘检测算子,它不是通过微分算子检测边缘,而是在满足一定约束条件下推导出的边缘检测最优化算子。2、不同边缘算子检测边缘分析本文基于Matlab编程实现不同边缘检测算子对一幅包含两个目标的图像进行边缘提取,原始图像如图2.1所示。Roberts边缘检测算子是一种利用局部差分方法寻找边缘的算子,其采用的是对角方向相邻两像素值之差;Sobel边缘算子所采用的算法是先进行加权平均,然后进行微分运算;Prewitt边缘检测算子就是一种利用局部差分平均方法寻找边缘的算子,其先求平均,再求差分,即利用所谓的平均差分来求梯度;拉普拉斯边缘检测算子正是对二维函数进行二阶导数运算的标量算子;Canny边缘检测算子通过中心边缘点为算子与图像的卷积在边缘梯度方向上的区域中的最大值在梯度方向上判断此点强度是否为其领域的最大值来确定该点是否为边缘点。图2.1原始图像22.1Roberts算子提取边缘图像图2.2Roberts算子边缘检测图像2.2Sobel算子提取边缘图像图2.3Sobel算子边缘检测图像32.3Prewitt算子提取边缘图像图2.4Prewitt算子边缘检测图像2.4Laplace算子提取边缘图像图2.5Laplace算子边缘检测图像42.5Log算子提取边缘图像图2.6Log算子边缘检测图像2.6Canny算子提取边缘图像图2.7Canny算子边缘检测图像53、Hough变换的边缘提取Hough变换利用图像空间和参数空间的点-线对偶性,将图像空间中具有一定关系的像素点在参数空间中进行聚集,通过在参数空间进行简单的累加和统计,找出参数空间中累加器的峰值点,进而确定出图像空间中特定几何特征的相关参数。图像空间中的任意一个点映射到参数空间中是一条直线,图像空间中位于同一直线上的点映射到参数空间中是一组相交于同一点的直线,反过来,参数空间中相交于同一点的所有直线,在图像空间中与之对应的是在同一直线上的一组点。Hough变换提取边缘的主要步骤为:一、读入一副图像,将读入图像转为二值化图像,遍历整幅图像,判断每一个像素点是否为白点;二、对每一个白点进行处理,按照相应的量化数值在变换域累加器数组中的相应位置上加1;三、遍历累加器数组,每找到一个局部最大值,判断该局部最大值是否大于所设置的阈值,若是,则将该最大值及其位置存放在上述定义的数组的一个元素中,并将该局部最大值附近的点清零,以便寻找下一个局部最大值,直到遍历整个数组找到的最大值小于设置的阈值为止。图3.1Hough变换边缘检测图像4、不同边缘检测算子的比较分析6从本文的分析结果来看,Roberts算子是2x2算子,对具有陡峭的低噪声图像响应最好。Sobel算子、Prewitt算子是3x3算子,对灰度渐变和噪声较多的图像处理得较好。使用两个掩模板组成边缘检测器时,通常取较大的幅度作为输出值。这使得它们对边缘的走向有些敏感。取它们的平方和的开方可以获得性能更一致的全方位响应。这与真实的梯度值更接近。值得注意的是3x3的Sobel算子和Prewitt边缘算子可扩展成八个方向,并且可以像使用Kirsch算子一样获得边缘方向图。Laplace算子与Log算子对屋脊型边缘的处理效果比较好,Log算子与Laplace算子的区别在于Log算子引入高斯函数,先对图像做平滑滤波处理。Hough变换对直线型的边缘提取效果较好,而对其他边缘提取效果不理想。附录1I=imread('Test.bmp');J=rgb2gray(I);figure(1),subplot(1,2,1),imshow(I),title('原始彩色图像');subplot(1,2,2),imshow(J),title('原始灰度图像');J1=edge(J,'Roberts');figure(1),subplot(1,2,1),imshow(J),title('原始灰度图像');subplot(1,2,2),imshow(J1),title('Roberts算子提取边缘图像');J2=edge(J1,'sobel');figure(2),imshow(J2),title('Sobel算子提取边缘图像');J3=edge(J,'prewitt');figure(3),imshow(J3),title('Prewitt算子提取边缘图像');J4=edge(J,'log');figure(4),imshow(J4),title('log算子提取边缘图像');J5=edge(J,'canny');figure(5),imshow(J5),title('canny算子提取边缘图像');h=fspecial('laplacian');%产生一个laplace算子7J6=imfilter(J,h);%拉普拉斯检测边缘图像figure(6),imshow(J6),title('laplace算子提取边缘图像');附录2I=imread('Test.bmp');I=rgb2gray(I);[m,n]=size(I);I=im2double(I);im=zeros(m,n);fori=3:m-2forj=3:n-2%处理领域较大,所以从图像(3,3)开始,在(m-2,n-2)结束l(i,j)=-I(i-2,j)-I(i-1,j-1)-2*I(i-1,j)-I(i-1,j+1)-I(i,j-2)-2*I(i,j-1)+16*I(i,j)-2*I(i,j+1)-I(i,j+2)-I(i+1,j-1)-2*I(i+1,j)-I(i+1,j+1)-I(i+2,j);%LoG算子endend[m,n]=size(l);fori=2:m-1forj=2:n-1y(i,j)=l(i-1,j-1)+l(i-1,j)+l(i-1,j+1)+l(i,j-1)+l(i,j)+l(i,j+1)+l(i+1,j-1)+l(i+1,j)+l(i+1,j+1);y(i,j)=y(i,j)/9;%LoG算子提取边缘后,对结果进行均值滤波以去除噪声,为下一步hough变换提取直线作准备endendq=im2uint8(y);[m,n]=size(q);fori=1:mforj=1:nifq(i,j)70;%设置二值化的阈值为70q(i,j)=255;%对图像进行二值化处理,使图像边缘更加突出清晰8elseq(i,j)=0;endendend%Hough变换检测直线,使用(a,p)参数空间,a∈[0,180],p∈[0,2d]a=180;%角度的值为0到180度d=round(sqrt(m^2+n^2));%图像对角线长度为p的最大值s=zeros(a,2*d);%存储每个(a,p)个数z=cell(a,2*d);%用元胞存储每个被检测的点的坐标fori=1:mforj=1:n%遍历图像每个点if(q(i,j)==255)%只检测图像边缘的白点,其余点不检测fork=1:ap=round(i*cos(pi*k/180)+j*sin(pi*k/180));%对每个点从1到180度遍历一遍,取得经过该点的所有直线的p值(取整)if(p0)%若p大于0,则将点存储在(d,2d)空间s(k,d+p)=s(k,d+p)+1;%(a,p)相应的累加器单元加1z{k,d+p}=[z{k,d+p},[i,j]'];%存储点坐标elseap=abs(p)+1;%若p小于0,则将点存储在(0,d)空间s(k,ap)=s(k,ap)+1;%(a,p)相应的累加器单元加1z{k,ap}=[z{k,ap},[i,j]'];%存储点坐标endendendendendfori=1:aforj=1:d*2%检查每个累加器单元中存储数量9if(s(i,j)30)%将提取直线的阈值设为70lp=z{i,j};%提取对应点坐标fork=1:s(i,j)%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作im(lp(1,k),lp(2,k))=255;%每个点R分量=255,G分量=0,B分量=0endendendendsubplot(1,2,1),imshow(I);title('原始图像');subplot(1,2,2),imshow(im);title('hough变换边缘图像');end