《canny边缘检测及matlab实现.docx》由会员分享,可在线阅读,更多相关《canny边缘检测及matlab实现.docx(8页珍藏版)》请在三一办公上搜索。
1、北京工业大学研究生课程考试答题纸考试课程:课程类别:学位课选修课研究生学号:研究生姓名:学生类别:博士硕士工程硕士进修生考试时间: 年 月 日一、实验目的:熟悉边缘检测原理,并运用matlab软件实现图像的canny边缘检测,体会canny 边缘检测的优缺点。二、实验内容:编写matlab程序,实现对lena图像的边缘检测,输出程序运行结果。三、实验原理或步骤:首先回顾一下边缘检测的一般步骤:边缘检测算法一般包含如下四个步骤:1. 滤波(去噪)。2. 增强(一般是通过计算梯度幅值)。3. 检测(在图像中有许多点的梯度幅值会比较大,而这些点并不都是边缘,所以 应该用某种方法来确定边缘点,比如最简
2、单的边缘检测判据:梯度幅值阈值)。4. 定位(有的应用场合要求确定边缘位置,可以在子像素水平上来估计,指出边 缘的位置和方向)Canny边缘检测的算法步骤:1. 用高斯滤波器平滑图像(不同尺度的Canny检测子由高斯的不同标准差来 表示)用一阶偏导的有限差分来计算梯度的幅值和方向。2. 对高斯平滑后的图像进行sobel边缘检测。这里需要求横的竖的还有联合 的,所以一共三个需要sobel边缘检测图像。3. 对联合的sobel检测图像进行非极大值抑制(Non-Maxima Suppression, NMS)4. 用双阈值算法检测和连接边缘,并进行滞后阈值处理。其中非极大值抑制细化了幅值图像中的屋脊
3、带,只保留幅值局部变化最大的 点。双阈值算法:用两个阈值得到两个阈值图像,然后把高阈值的图像中的边缘 连接成轮廓,连接时到达轮廓的端点时,在低阈值图像上找可以连接的边缘。不 断收集,直到所有的间隙连接起来为止。四、运行结果和分析每步运行效果:Figure2高斯模糊后:Figure4非极大抑制后:Canny算子的方向性使得它的边缘检测和定位优于其他算子,具有更好的边缘强 度估计,能产生梯度方向和强度两个信息。五、算法程序Main.mclear all;close all;clc;img=imread(lena.bmp);imshow(img);m n=size(img);img=double(i
4、mg);%canny边缘检测的前两步相对不复杂,所以我就直接调用系统函数了%高斯滤波w=fspecial(gaussian,5 5);img=imfilter(img,w,replicate);figure;imshow(uint8(img)%sobel边缘检测w=fspecial(sobel);%求横边缘img_w=imfilter(img,w,replicate);w=w;%求竖边缘%注意这里不是简单的求平均,而是平方和在开方。img_h=imfilter(img,w,replicate);img=sqrt(img_w.A2+img_h.A2);figure;imshow(uint8(im
5、g)%下面是非极大抑制new_edge=zeros(m,n);for i=2:m-1for j=2:n-1Mx=img_w(i,j);My=img_h(i,j);if My=0%边缘的法线弧度o=atan(Mx/My);elseif My=0 & Mx0 o=pi/2;elseo=-pi/2;end%Mx处用My和img进行插值adds=get_coords(o);%边缘像素法线一侧求得的两点坐标,插值需要M1=My*img(i+adds ,j+adds(1)+(Mx-My)*img(i+adds (4) ,j+adds (3);% 插值后得到的像素,用此像素和当前像素比较adds=get_c
6、oords(o+pi);%边缘法线另一侧求得的两点坐标,插值需要M2=My*img(i+adds ,j+adds (1)+(Mx-My)*img(i+adds (4),j+adds (3);% 另一侧插值得到的像素,同样和当前像素比较isbigger=(Mx*img(i,j)M1)*(Mx*img(i,j)=M2)+(Mx*img(i,j)M1)*(Mx*img(i,j)up &new_edge(i,j)=255 %判断上阈值new_edge(i,j)=255;new_edge=connect(new_edge,i,j,low);endendendfigure;imshow(new_edge=
7、255)get_coords.mfunction re=get_coords(angle) %angle是边缘法线角度,返回法线前后两点 sigma=0.000000001;x1=ceil(cos(angle+pi/8)*sqrt(2)-0.5-sigma);y1=ceil(-sin(angle-pi/8)*sqrt(2)-0.5-sigma);x2=ceil(cos(angle-pi/8)*sqrt(2)-0.5-sigma);y2=ceil(-sin(angle-pi/8)*sqrt(2)-0.5-sigma);re=x1 y1 x2 y2;endconnect.mfunction nedge=connect(nedge,y,x,low) % 种子定位后的连通分析 neighbour=-1 -1;-1 0;-1 1;0 -1;0 1;1-1;1 0;1 1; %八连通搜寻 m n=size(nedge);for k=1:8yy=y+neighbour(k,1);xx=x+neighbour(k,2);if yy=1 &yy=1 & xx=low & nedge(yy,xx)=255% 判断下阈值nedge(yy,xx)=255;nedge=connect(nedge,yy,xx,low);endendendend