预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

北京工业大学 研究生课程考试答题纸 题号分数任课教师签名一二三四五六七八九十总分 考试课程: 课程类别:学位课选修课 研究生学号: 研究生姓名: 学生类别:博士硕士 工程硕士进修生 考试时间:年月日 一、实验目的: 熟悉边缘检测原理,并运用matlab软件实现图像的canny边缘检测,体会canny边缘检测的优缺点。 二、实验内容: 编写matlab程序,实现对lena图像的边缘检测,输出程序运行结果。 三、实验原理或步骤: 首先回顾一下边缘检测的一般步骤: 边缘检测算法一般包含如下四个步骤: 1.滤波(去噪)。 2.增强(一般是通过计算梯度幅值)。 3.检测(在图像中有许多点的梯度幅值会比较大,而这些点并不都是边缘,所以应该用某种方法来确定边缘点,比如最简单的边缘检测判据:梯度幅值阈值)。 4.定位(有的应用场合要求确定边缘位置,可以在子像素水平上来估计,指出边缘的位置和方向) Canny边缘检测的算法步骤: 1.用高斯滤波器平滑图像(不同尺度的Canny检测子由高斯的不同标准差来表示)用一阶偏导的有限差分来计算梯度的幅值和方向。 2.对高斯平滑后的图像进行sobel边缘检测。这里需要求横的竖的还有联合的,所以一共三个需要sobel边缘检测图像。 3.对联合的sobel检测图像进行非极大值抑制(Non-MaximaSuppression,NMS) 4.用双阈值算法检测和连接边缘,并进行滞后阈值处理。 其中非极大值抑制细化了幅值图像中的屋脊带,只保留幅值局部变化最大的点。 双阈值算法:用两个阈值得到两个阈值图像,然后把高阈值的图像中的边缘连接成轮廓,连接时到达轮廓的端点时,在低阈值图像上找可以连接的边缘。不断收集,直到所有的间隙连接起来为止。 四、运行结果和分析 每步运行效果: Figure1原图: Figure2高斯模糊后: Figure3sobel边缘检测后: Figure4非极大抑制后: Figure5上阈值120,下阈值100检测结果: Canny算子的方向性使得它的边缘检测和定位优于其他算子,具有更好的边缘强度估计,能产生梯度方向和强度两个信息。 五、算法程序 Main.m clearall; closeall; clc; img=imread('lena.bmp'); imshow(img); [mn]=size(img); img=double(img); %%canny边缘检测的前两步相对不复杂,所以我就直接调用系统函数了 %%高斯滤波 w=fspecial('gaussian',[55]); 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.^2+img_h.^2);%注意这里不是简单的求平均,而是平方和在开方。 figure; imshow(uint8(img)) %%下面是非极大抑制 new_edge=zeros(m,n); fori=2:m-1 forj=2:n-1 Mx=img_w(i,j); My=img_h(i,j); ifMy~=0 o=atan(Mx/My);%边缘的法线弧度 elseifMy==0&&Mx>0 o=pi/2; else o=-pi/2; end %Mx处用My和img进行插值 adds=get_coords(o);%边缘像素法线一侧求得的两点坐标,插值需要 M1=My*img(i+adds(2),j+adds(1))+(Mx-My)*img(i+adds(4),j+adds(3));%插值后得到的像素,用此像素和当前像素比较 adds=get_coords(o+pi);%边缘法线另一侧求得的两点坐标,插值需要 M2=My*img(i+adds(2),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)<=M2);%如果当前点比两边点都大置1 ifisbigger new_edge(i,j)=img(i,j); end end end figure; imshow(uint8(new_edge)) %%下面是滞后阈值处理 up=120;%上阈值 low=1