关于通过matlab实现Canny边缘处理的一些笔记

这篇具有很好参考价值的文章主要介绍了关于通过matlab实现Canny边缘处理的一些笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近看了一些神经网络处理图像的视频,受到卷积核的启发,突然对图像处理感兴趣,于是就单从边缘检测算法入手,学习了比较高级的Canny边缘处理,也通过matlab实现了Canny边缘处理。


相比较于通过soble算子sx和sy处理,提取水平和竖直边缘信息,平方和相加开根号得到的边缘提取图像,canny边缘算法具有一下优势:

1.解决了边缘过宽问题

关于通过matlab实现Canny边缘处理的一些笔记

左图为普通边缘处理,右图为Canny算法处理

可以看到明显的单层边界线 

2.去除了部分噪点


下面记录一下主要流程和相关函数

1.导入并处理rgb图片

如A =  imread('Figure.jpg') , 从目录下的文件中找到图片,导入。

此时A为三维rgb数据,判断维度函数为 ndims(A),返回值为维度。

导入图片矩阵格式一般为int8,需要再转化为double形式,否则矩阵计算中会出现问题,比如sqrt(imgx.^2+imgy.^2)计算中报错,显示输入数据格式不对。

使用im2double(A)函数转化为double形式。

随后将rgb图片转化为灰度值图片:

使用 B = rgb2gray(A);

部分代码如下

    %判断是否为rgb图片,是则转化为灰度图
    if ndims(preimg)==3
        preimg=im2double(preimg);
        grayimg=rgb2gray(preimg); %转化为灰度图
    else
        grayimg=preimg;
    end

2.高斯滤波

对图像进行平滑模糊处理,更容易检测出边缘

利用高斯分布的矩阵,卷积原图

fspecial函数生成高斯分布矩阵H

%高斯滤波
H=fspecial('gaussian',[2*k+1,2*k+1],c); 
imgG=imfilter(grayimg, H, 'replicate');

k为高斯矩阵外围层数,c为方差

k根据图像实际情况调整,实际上k越大代表一个像素与周围像素关联性越大,所以边缘较清晰的k值小。

c越大,图像越模糊

k值均为7,上图方差为1,下图为5

关于通过matlab实现Canny边缘处理的一些笔记

 

关于通过matlab实现Canny边缘处理的一些笔记

 可以看出,高斯处理不足导致边界检测模糊,很难形成一条线

3.计算梯度和梯度方向

使用soble算子sx,sy计算在x方向和y方向梯度(imgx,imgy)以及梯度方向G_d

梯度方向通过atan函数求得

    %梯度计算
    sx=[1 0 -1;2 0 -2;1 0 -1];
    imgx=imfilter(imgG,sx,'replicate');
    sy=[1 2 1; 0 0 0;-1 -2 -1];
    imgy=imfilter(imgG,sy,'replicate');
    %梯度值
    G=sqrt(imgx.^2+imgy.^2);
    %梯度方向
    G_d=atand(imgy./imgx);
    %给空值赋0
    for y=1:size(G,1)
        for x=1:size(G,2)
            if ismissing(G_d(y,x))
                G_d(y,x)=90;
            end
        end
    end

这里会有个小问题,就是imgx值为0时,得到梯度方向为NaN,此时通过ismissing函数判断数据是否为NaN,手动设置为90度。

之后判断梯度方向,从上下,到/,到左右,到\依次定义为1,2,3,4

注意:这里的梯度角度和开始设置的x,y方向有关

%判断梯度方向
%梯度方向分别为上下,左右,/,\,
    G_s=zeros(size(grayimg,1),size(grayimg,2));
    for y=1:size(G_d,1)
        for x=1:size(G_d,2)
            if (G_d(y,x)> 67.5 & G_d(y,x)<= 90 )| (G_d(y,x)< -67.5 & G_d(y,x)>= -90)
                G_s(y,x)=1;
            end
            if (G_d(y,x)> 22.5 & G_d(y,x)<= 67.5 )
                G_s(y,x)=2;
            end
            if (G_d(y,x)>= -22.5 & G_d(y,x)<= 22.5 )
                G_s(y,x)=3;
            end
            if (G_d(y,x)>= -66.5 & G_d(y,x)< -22.5 )
                G_s(y,x)=4;
            end
        end
    end

从而得到方向矩阵G_s

4.非极大值抑制NMS

这一步操作是为了减小边缘粗细

判断梯度方向上的值的大小,如果比梯度方向值小,则令其值为0

也就是挑选出边缘上梯度最大的一条线,从而减小边缘粗细

    %非极大值抑制
    %添加0边
    G0=zeros(size(G,1)+2,size(G,2)+2);
    G0(2:(size(G,1)+1),2:(size(G,2)+1))=G;
    G_d=G;
    for y=1:size(G,1)
        for x=1:size(G,2)
            if G_s(y,x)==1
                if G0(y+1,x+1) < max(G0(y+1+1,x+1),G0(y+1-1,x+1))
                    G_d(y,x)=0;
                end
            end
            if G_s(y,x)==2
                if G0(y+1,x+1) < max(G0(y+1-1,x+1+1),G0(y+1+1,x+1-1))
                    G_d(y,x)=0;
                end
            end
            if G_s(y,x)==3
                if G0(y+1,x+1) < max(G0(y+1,x+1-1),G0(y+1,x+1+1))
                    G_d(y,x)=0;
                end
            end
            if G_s(y,x)==4
                if G0(y+1,x+1) < max(G0(y+1+1,x+1+1),G0(y+1-1,x+1-1))
                    G_d(y,x)=0;
                end
            end
        end
    end

这里添加0边是为了在之后比较时数组不超界

5.双阈值处理

为了减小噪声,过滤部分无关信息,采用双阈值处理,大于阈值时保持不变,小于阈值时置0,在阈值中间时,判断周围8格内是否有大于阈值的像素,如果有则不变,否则置0

这里高阈值一般在0.3到0.5,较暗图像取0.1

低阈值一般小于0.1,这个随具体情况而定

    %双阈值处理

    G_t=G_d;
    %加个边
    G0=zeros(size(G,1)+2,size(G,2)+2);
    G0(2:(size(G,1)+1),2:(size(G,2)+1))=G_d;
    for y=1:size(G_d,1)
        for x=1:size(G_d,2)
            if G_d(y,x)>=TH
            elseif G0(y,x)<= TL
                G_t(y,x)=0;
            elseif G0(y,x)> TL & G0(y,x)< TH
                if (G0(y+1,x+1)>=TH | G0(y+1,x)>=TH | G0(y+1,x-1)>=TH | G0(y,x+1)>=TH ...
                        | G0(y,x-1)>=TH | G0(y-1,x+1)>=TH | G0(y-1,x)>=TH | G0(y-1,x-1)>=TH)
                    else
                        G_t(y,x)=0;
                end
            end
        end
    end

这里同样加了0边,防止超界

最后封装函数,变量设为preimg(图片矩阵),TH、TL为阈值,k,c为高斯处理时矩阵层数和方差。

函数默认TH、TL、k、c分别为0.5、0.1、1、1, 一般较大的图片k值设置为4-15,c值1-10

可以通过结果修改参数,以达到最好的效果!文章来源地址https://www.toymoban.com/news/detail-451065.html

到了这里,关于关于通过matlab实现Canny边缘处理的一些笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像处理之canny边缘检测(非极大值抑制和高低阈值)

    Canny算子是John F.Canny 大佬在1986年在其发表的论文 《Canny J. A computational approach to edge detection [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1986 (6): 679-698.》提出来的。 低错误率。所有边缘都应该被找到,并且应该没有伪响应。也就是检测到的边缘必须尽可能时真实的边缘

    2024年02月16日
    浏览(40)
  • 数字图像处理【11】OpenCV-Canny边缘提取到FindContours轮廓发现

    本章主要介绍图像处理中一个比较基础的操作:Canny边缘发现、轮廓发现 和 绘制轮廓。概念不难,主要是结合OpenCV 4.5+的API相关操作,为往下 \\\"基于距离变换的分水岭图像分割\\\" 做知识储备。 在讲述轮廓之前,要花点时间学学边缘检测提取的一个著名算法——Canny边缘提取算法

    2024年02月16日
    浏览(38)
  • python数字图像处理基础(五)——Canny边缘检测、图像金字塔、图像分割

    梯度是什么? 梯度就是变化的最快的那个方向 edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 第一个参数是需要处理的原图像,该图像必须为单通道的灰度图; 第二个参数是阈值1; 第三个参数是阈值2。 原理步骤 1)使用高斯滤波器,以平滑图像,滤除噪

    2024年01月18日
    浏览(44)
  • 图像处理——边缘检测(MATLAB实现)

    实验表明,人眼对图像中边缘的识别不是通过设置阈值来分割的,目标的边缘一般表现为灰度(对彩色图像还包括色度)的特变。对于人类的视觉感知,图像边缘对理解图像内容起到关键作用。在灰度渐变的图像中无法区分其灰度变化的边界,但如果边界灰度有突变,则可以区

    2024年02月03日
    浏览(39)
  • 我在Vscode学OpenCV 图像处理三(图像梯度--边缘检测【图像梯度、Sobel 算子、 Scharr 算子、 Laplacian 算子、Canny 边缘检测】)

    这里需要区分开边缘检测和轮廓检测 边缘检测并非万能,边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。 OpenCV 提供了查找图像轮廓的函数 cv2.findContours(),该函数能够查找图

    2024年02月04日
    浏览(56)
  • 【OpenCV实现图像梯度,Canny边缘检测】

    OpenCV中,可以使用各种函数实现图像梯度和Canny边缘检测,这些操作对于图像处理和分析非常重要。 图像梯度通常用于寻找图像中的边缘和轮廓。在OpenCV中,可以使用cv2.Sobel()函数计算图像的梯度,该函数可以计算图像在水平和垂直方向上的梯度。梯度的方向和大小可以帮助

    2024年02月07日
    浏览(48)
  • python实现Canny算子边缘检测算法

        边缘检测是一种将图片中关键信息表现出来的一种图片技术,它的结果并不是字面意思上的获取图片边缘,而是将图片有用的信息勾勒出来,类似素描的结果,但是已经去掉了很多信息。如下所示,一张原始的图片是这样的:          通过边缘检测算法,我们最终得到

    2024年02月08日
    浏览(40)
  • Canny 边缘检测算法-python实现(附代码)

    摘要 : Canny 边缘检测算法由计算机科学家 John F. Canny 于 1986 年提出的。其不仅提供了算法,还带来了一套边缘检测的理论,分阶段的解释如何实现边缘检测。Canny 检测算法包含下面几个阶段: 图像灰度化 高斯模糊处理 图像梯度、梯度幅值、梯度方向计算 NMS(非极大值抑制)

    2024年02月04日
    浏览(38)
  • 【图像处理】基于二维FIR的特定角度边缘检测(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🌈3 Matlab代码实现 🎉4 参考文献 图像边缘

    2024年02月09日
    浏览(41)
  • Canny算子边缘检测原理讲解及其完整C语言实现(不使用opencv)

    作者:队友调车我吹空调 日期:2023/05/17 版权:遵循CC 4.0 BY-SA版权协议 这里是后期的笔者,本文算是笔者的学习笔记,主要是在单片机中使用的,再者就是由于某些原因,笔者不想使用opencv,因此尝试跟着原理手搓了这份代码,笔者也尽力将代码写到最简和效率最优了。然而

    2024年04月27日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包