MATLAB边缘检测

一、目的:

熟悉边缘检测原理,并运用matlab软件实现图像的canny边缘检测,体会canny边缘检测的优缺点。

二、内容:

编写matlab程序,实现对lena图像的边缘检测,输出程序运行结果。

三、原理或步骤:

首先回顾一下边缘检测的一般步骤:

边缘检测算法一般包含如下四个步骤:

1.滤波(去噪)。

2.增强(一般是通过计算梯度幅值)。

3.检测(在图像中有许多点的梯度幅值会比较大,而这些点并不都是边缘,所以应该用某种方法来确定边缘点,比如最简单的边缘检测判据:梯度幅值阈值)。

4.定位(有的应用场合要求确定边缘位置,可以在子像素水平上来估计,指出边缘的位置和方向)

Canny边缘检测的算法步骤:

1.用高斯滤波器平滑图像(不同尺度的Canny检测子由高斯的不同标准差来表示)用一阶偏导的有限差分来计算梯度的幅值和方向。

2.对高斯平滑后的图像进行sobel边缘检测。这里需要求横的竖的还有联合的,所以一共三个需要sobel边缘检测图像。

3.对联合的sobel检测图像进行非极大值抑制(Non-Maxima Suppression, NMS)

4.用双阈值算法检测和连接边缘,并进行滞后阈值处理。

其中非极大值抑制细化了幅值图像中的屋脊带,只保留幅值局部变化最大的点。

双阈值算法:用两个阈值得到两个阈值图像,然后把高阈值的图像中的边缘连接成轮廓,连接时到达轮廓的端点时,在低阈值图像上找可以连接的边缘。不断收集,直到所有的间隙连接起来为止。

四、运行结果和分析

每步运行效果:

Figure1原图:

Canny算子的方向性使得它的边缘检测和定位优于其他算子,具有更好的边缘强度估计,能产生梯度方向和强度两个信息。

五、算法程序

M ain.m

clear all;

close all;

clc;

img=imread('lena.bmp');

imshow(img);

m n\]=size(img); img=double(img); %%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.\^2+img_h.\^2); %注意这里不是简单的求平均,而是平方和在开方。 figure; imshow(uint8(img)) %%下面是非极大抑制 new_edge=zeros(m,n); for i=2:m-1 for j=2:n-1 Mx=img_w(i,j); My=img_h(i,j); if My\~=0 o=atan(Mx/My); %边缘的法线弧度 elseif My==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)\up \&\&new_edge(i,j)\~=255 %判断上阈值 new_edge(i,j)=255; new_edge=connect(new_edge,i,j,low); end end end figure; imshow(new_edge==255)

相关推荐
站大爷IP4 分钟前
Python文本序列的类型
python
千千寰宇20 分钟前
[Java/Python] Java 基于命令行调用 Python
python·java se-jdk/jvm
T.D.C22 分钟前
【OpenCV】使用opencv找哈士奇的脸
人工智能·opencv·计算机视觉
科研工作站32 分钟前
【创新算法】改进深度优先搜索算法配合二进制粒子群的配电网故障恢复重构研究
matlab·配电网·故障恢复·改进粒子群·深度优先搜索·33节点
yvestine1 小时前
自然语言处理——文本表示
人工智能·python·算法·自然语言处理·文本表示
zzc9211 小时前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
软件算法开发1 小时前
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
matlab·wsn·距离变化·能量开销·动态调整·低功耗拓扑控制开销算法
编程有点难2 小时前
Python训练打卡Day43
开发语言·python·深度学习
2301_805054562 小时前
Python训练营打卡Day48(2025.6.8)
pytorch·python·深度学习
LjQ20402 小时前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫