0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA图像处理之Canny边缘检测

FPGA开源工坊 来源:FPGA开源工坊 2023-11-17 09:10 次阅读

在边缘检测算法里面Sobel是比较简单的一个算法,但是其检测出来的边缘往往是比较粗的,效果不是很好,因为我们最理想的边缘肯定就是一个宽度为1的细线。

Canny算法在此基础上进行了改进,通过使用边缘的梯度信息进行非最大值抑制(NMS)和利用双阈值,这些措施消除了假性边缘,提高了边缘检测的效果。

Canny边缘检测分为以下几个部分:

高斯滤波

Sobel边缘检测

非最大值抑制

双阈值边缘检测

弱边缘连接

高斯滤波和Sobel边缘检测在之前的文章里面介绍过,在这里不再赘述。

可以参见:FPGA图像处理--Sobel边缘检测FPGA图像处理--高斯模糊(一)FPGA图像处理--高斯模糊(二)这三篇文章。

在本篇中为大家介绍Canny边缘检测中的NMS部分。

我们通过Sobel的计算可以获得两个信息,分别是梯度的幅值和方向。

梯度的幅值可以表示为:

因为我们想在FPGA中实现Canny算子,而根号对FPGA来说消耗的资源是比较多的,因此我们选择另一种幅值的表示方式:

梯度的方向可以表示为:

接下来就可以通过梯度的幅值和方向来做NMS了。

我们在做完Sobel之后得到的幅值和方向也就是下面一幅示意图

ec822e8a-84e5-11ee-939d-92fbcf53809c.png

每一个点都有其方向和梯度的值。

假如我们Sobel检测的阈值设置的为90,那么在上面示意图中左上角的99,108,110,97这几个点都会被看做边缘部分,在Canny中会对这个做NMS,首先看到99他的梯度方向向下,然后梯度方向下一个值是110比99大,那么就认为99这个点不是边缘,110比他更靠近边缘部分,这样99就被抑制掉了,边缘也能够被细化。对于108来说,他的梯度方向下一个值是77,比108小,那么108就不会被抑制。通过这种方式就能完成非最大值抑制。

在上图里面展示的梯度方向只有0,45,90这些角度,然而在实际计算中不可能只有这些角度的,所以我们要进行插值计算,接下来就说明一下如何进行插值计算。

ec96f810-84e5-11ee-939d-92fbcf53809c.png

以任意一点为坐标原点,如上图中的5这个点,他周围有一个3*3的矩阵,然后他的梯度方向是红色箭头的方向。这个方向不在X和Y轴的45°方向(PS:我们规定图像向下为Y轴正方向,向右为X轴正方向,象限为顺时针方向)。

因为其不在45°方向,那么就不能直接将5的梯度和1,9的梯度进行比较来确定是否对5这点进行抑制,那么我们就需要使用插值的方式来生成两个点(亚像素点)进而进行判断。

在上图里面可以看到GX和GY的方向相同并且GX大于GY,所以我们分别选取6 9和1 4这四个点来进行插值以生成两个亚像素点。

在之前的介绍里面我们知道梯度的方向是用arctan来表示的,但是这个计算比较复杂,我们也仅仅是为了插值计算,所以并不需要进行arctan的计算,只需要拿到GX和GY的值即可。

因为GX大于GY,所以让GY/GX这样得到一个小于1的值,记作weight。那么我们就可以得到一个比例关系:

point1 = 9*weight +6 *(1 - weight)

point2 = 1*weight+4* (1 - weight)

这样就能得到两个亚元素点,通过比较5这个点和point1以及point2的大小就可以决定是否对其进行抑制。

通过将GX和GY的关系可以分为以下四种情况:

|GX| >|GY| 并且 GX和GY同号

|GX|>|GY|并且 GX和GY异号

|GX| < |GY| 并且 GX和GY同号

|GX| < |GY| 并且 GX和GY异号

其他几个方向的分析就不赘述了,可以直接看代码里面的实现:

代码里面矩阵的坐标关系如下图:

eca77b86-84e5-11ee-939d-92fbcf53809c.png

python实现的参考模型如下:

ecaea1b8-84e5-11ee-939d-92fbcf53809c.png

可以根据上面的坐标对应关系来分析剩下的几种情况。

来看一下实现的效果:

可以明显看到nms之后的结果相对于sobel之后的结果要细化很多。

Python的NMS参考模型介绍完了,之后就是Verilog的RTL怎么实现它,今天就写到这里,休息。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21326

    浏览量

    593230
  • 图像处理
    +关注

    关注

    26

    文章

    1225

    浏览量

    55827
  • 边缘检测
    +关注

    关注

    0

    文章

    91

    浏览量

    18105

原文标题:FPGA图像处理--Canny边缘检测(一)

文章出处:【微信号:FPGA开源工坊,微信公众号:FPGA开源工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Canny双阈值边缘检测和弱边缘连接详解

    在上一篇FPGA图像处理--Canny边缘检测(一)里介绍了
    的头像 发表于 11-18 17:07 1008次阅读

    基于Canny边缘检测算子的图像检索算法

    【摘要】:针对依赖传统Canny算子的基于边缘图像检索系统所存在的不足,提出一种基于Canny边缘检测
    发表于 04-24 10:03

    用DM642开发板做的canny边缘检测算法(附CCS源码

    本帖最后由 mr.pengyongche 于 2013-4-30 02:24 编辑 用DM642开发板做的canny边缘检测算法(附CCS源码),如果需要其他的相关资料大家可以向我要,我会将更多
    发表于 03-31 14:50

    基于FPGA的数字图像处理中的边缘检测系统

    `基于FPGA的数字图像处理领域的边缘检测系统。该系统实现了从24位真彩色图片的存储到VGA显示边缘
    发表于 06-26 13:36

    【DragonBoard 410c试用体验】OpenCV中canny算子边缘检测

    `具体介绍之前,先来一起看看边缘检测的一般步骤 滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用
    发表于 09-11 23:24

    关于canny算子边缘检测的问题

    本帖最后由 豆吖豆 于 2017-4-4 23:14 编辑 grd=edge(Egray,'canny',0.09,'both');大神门 问一下这个后面的0.09和both什么意思是指的是Egray图像的上下大小还是,另外可以的话能大概说说这个
    发表于 04-04 22:27

    基于FPGA的Sobel边缘检测的实现

    我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测、中值滤波、Canny算子边缘
    发表于 08-29 15:41

    如何利用FPGA实现Laplacian图像边缘检测器的研究?

    图形处理领域,图像处理的速度一直是一个很难突破的设计瓶颈。这里通过研究图像边缘检测器的
    发表于 07-31 06:38

    图象处理中的哈夫变换和Canny边缘检测算法

    图象处理中的边缘检测------canny算子
    发表于 03-16 06:48

    Labview图像处理——边缘检测

    。Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像
    发表于 12-01 12:16

    边缘检测的几种微分算子

    一、边缘检测边缘检测的几种微分算子:一阶微分算子:Roberts、Sobel、Prewitt二阶微分算子:Laplacian、Log/Marr非微分算子:
    发表于 07-26 08:29

    基于Canny 法的红外小目标边缘检测方法

    从红外图像的特点出发,基于Canny算法进行了目标边缘检测。首先,对源图像进行小波分解和重构,对图像
    发表于 05-27 15:02 12次下载

    基于Canny边缘检测算子的图像检索算法

      针对依赖传统Canny算子的基于边缘图像检索系统所存在的不足,提出一种基于Canny边缘
    发表于 02-11 11:22 28次下载

    基于FPGA图像边缘检测

    基于FPGA图像边缘检测 引言     图像边缘
    发表于 01-14 11:07 1734次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>图像</b><b class='flag-5'>边缘</b><b class='flag-5'>检测</b>

    canny边缘检测

    《OpenCV3编程入门》书本配套源代码canny边缘检测
    发表于 06-06 15:20 2次下载