当前位置: 首页 > article >正文

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

五、算法程序

Main.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)<M1)*(Mx*img(i,j)<=M2); %如果当前点比两边点都大置1

        if isbigger

           new_edge(i,j)=img(i,j);

        end        

    end

end

figure;

imshow(uint8(new_edge))

%%下面是滞后阈值处理

up=120;     %上阈值

low=100;    %下阈值

set(0,'RecursionLimit',10000);  %设置最大递归深度

for i=1:m

    for j=1:n

      if new_edge(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)


http://www.kler.cn/news/358519.html

相关文章:

  • Elasticsearch高级搜索技术-自定义评分规则
  • 图论day60|108.冗余连接(卡码网) 、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】
  • 013_django基于大数据的高血压人群分析系统2024_dcb7986h_055
  • 大数据开发基于Hadoop+springboot平台的岗位推荐系统
  • 帝国cms取得内容和栏目链接地址的方法
  • 波浪理论(Elliott Wave Theory)
  • win10专业版电脑.net framework3.5sp1进度条不动如何开启
  • IO编程--两进程间的实时通信
  • 6-4.Android 对话框之进度对话框问题清单(UI 线程问题、外部取消、dismiss 方法与 hide 方法)
  • MySQL-21.多表设计-案例-关系分析-表结构
  • 数据结构与算法——Java实现 41.对称二叉树
  • 基于FPGA的信号发生器verilog实现,可以输出方波,脉冲波,m序列以及正弦波,可调整输出信号频率
  • 2024-10-15 问AI: [AI面试题] 人工智能中使用了哪些不同的搜索算法?
  • 《Windows PE》7.3 遍历资源表
  • PostgreSQL学习笔记:PostgreSQL vs MySQL
  • 汽车票在线预订:SpringBoot技术实践
  • 探索程序之道:为什么要开发程序
  • R语言详解predict函数
  • Python 网络爬虫入门与实战
  • [C#][winform]基于yolov8的8种人脸表情检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面