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

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

3天内不再提示

Canny算子计算流程

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-07-04 09:31 次阅读

Canny算子计算流程:

高斯滤波和Sobel算子已经在前面讲过,所以这里主要讨论非最大值抑制和滞后分割电路设计

非最大值一直电路设计

非最大值抑制主要是对Sobel运算的计算结果进行开窗,在当前像素的3x3邻域找到梯度方向上的最大值,若当前像素为整个方向上的最大值,则将该像素点归为潜在的边缘点。否则,直接置为非边缘点。

9eb2f532-fb2e-11ec-ba43-dac502259ad0.jpg

我们首先要明白当前像素的梯度值位于哪一个象限,假定其位于第一象限,则有

9ecc15b2-fb2e-11ec-ba43-dac502259ad0.png

假定该点计算结果为result,则有

9eea5784-fb2e-11ec-ba43-dac502259ad0.png

不妨再列出第二象限的计算公式

9eff2e7a-fb2e-11ec-ba43-dac502259ad0.png

9f0ff606-fb2e-11ec-ba43-dac502259ad0.png

设计的难点在于梯度方向上两个潜在极大值的插值运算f算子。有两点值得我们注意:

1)f算子中包含除法,这是在FPGA中不容易处理的。

2)前两个象限的除法运算的分子和分母是颠倒的,这是不容易设计的。

所以就需要进行算法的等效转换,首先想到的就是将除法转换为乘法运算,这个是比较容易实现的,以第一象限公式为例,两边同时乘以x,则有

9f274388-fb2e-11ec-ba43-dac502259ad0.png

9f38b99c-fb2e-11ec-ba43-dac502259ad0.png

对于第二象限,两边同时乘以y,则有

9f4fa10c-fb2e-11ec-ba43-dac502259ad0.png

9f274388-fb2e-11ec-ba43-dac502259ad0.png

不等式右边第一项系数为当前x与y方向梯度值的较小值,第二项系数为当前x与y方向梯度的较大值与较小值之差,不等式左边系数为当前x与y方向梯度值的较大值。因此,将公式变换如下:

9f82378e-fb2e-11ec-ba43-dac502259ad0.png

9f9200e2-fb2e-11ec-ba43-dac502259ad0.png

上式中,Mmax代表当前x与y方向梯度值的较大值,Mmin代表当前x与y方向梯度值的较小值。C0,C1,C2,C3,则分别代表4个插值元素。对于8个不同的象限,插值元素的索引号如下表所示:

Index of C0 Index of C1 Index of C2 Index of C3
第1,5象限 2 5 6 3
第2,6象限 2 1 6 7
第3,7象限 0 1 8 7
第4,8象限 0 3 8 5

这样,就可以实现4个主象限的计算一致性,同时将转换为FPGA所擅长的乘法和加法运算。

在查表得到插值元素时,需要知道当前的象限信息,得到象限信息的最简单办法就是通过查询x与y方向梯度值的符号。同时,需要得到两个值的比较关系。需要注意的是,我们需要Sobel运算结果的x与y方向的输出,以及模值输出,实际上并不需要方向计算。

第一阶段的计算电路如图所示:

9faa1916-fb2e-11ec-ba43-dac502259ad0.jpg

首先将Sobel的x和y方向的计算结果通过Cordic模块输出两个值的绝对值的较大值Max和较小值Min,以及输入坐标的象限信息Quadrant_info。接着为了得到当前像素的8个插值元素,即当前窗口,我们需要将上面三个数据及Sobel的模值结果Mudule送入win_buf得到窗口缓存。我们需要的是当前窗口的9个元素Mudule(8:0),以及上面三个数据的当前值Max(4),Min(4),Quadrant_info(4)。

第二阶段的计算电路如图所示:

9fc22236-fb2e-11ec-ba43-dac502259ad0.jpg

第二阶段的计算将象限信息和当前窗口像素送入查找表,由查找表电路得到C0,C1,C2,C3输出。然后在此基础上做f算子,得到的结果与中心窗口值与Max的乘积进行比较。最后,在比较的结果上进行分割。

审核编辑 :李倩

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

    关注

    0

    文章

    125

    浏览量

    25669
  • Canny
    +关注

    关注

    0

    文章

    14

    浏览量

    9677

原文标题:Canny

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenCV边缘检测算子Laplace、LoG详解

    一阶导数算子(例如 Sobel 算子)通过对图像求导来确定图像的边缘,数值绝对值较高的点对应了图像的边缘。如果继续求二阶导,原先数值绝对值较高的点对应了过零点。因此,也可以通过找到二阶导数的过零点来检测边缘。在某些情况下,找二阶导数的过零点可能更容易。
    的头像 发表于 12-21 16:34 412次阅读
    OpenCV边缘检测<b class='flag-5'>算子</b>Laplace、LoG详解

    国产嵌入式实验箱操作教程_创龙教仪:5-12 边缘检测(LCD显示)

    与导数的关系:dy = f ‘(x) dx。 Canny 边缘检测 Canny边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,目前已广泛应用于各种计算机视觉系统。边缘
    发表于 12-14 14:09

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

    在上一篇FPGA图像处理--Canny边缘检测(一)里介绍了Canny边缘检测的NMS计算,这里就介绍一下双阈值边缘检测和弱边缘连接。
    的头像 发表于 11-18 17:07 1005次阅读

    python中用Canny边缘检测和霍夫变实现车道线检测方法

    Canny边缘检测+霍夫变换 颜色阈值+图像掩模的方法虽然简单,但是只能应对一些固定颜色车道线的场景。图像像素受光照影响将是一个极其常见的问题。 canny边缘检测+霍夫变换是另外一种简单提取车道
    的头像 发表于 11-17 16:55 302次阅读
    python中用<b class='flag-5'>Canny</b>边缘检测和霍夫变实现车道线检测方法

    以下是一个简单的OpenCV矩形检测代码示例,其中包括了Canny边缘检测和approxPolyDP多边形拟合的步骤

    读取了一张图像,并将其转换为灰度图像。然后使用Canny边缘检测算子提取图像中的边缘。接下来,我们使用findContours函数查找图像中的轮廓,并遍历每个轮廓进行多边形拟合和矩形检测。在多边形拟合
    发表于 11-01 09:28

    对于形状近似矩形但边缘有规则起伏的情况,可以使用OpenCV库中的approxPolyDP函数进行多边形拟合和矩形检测。

    的多边形拟合,并可以通过设置epsilon参数来控制输出的精度。如果epsilon参数设置得较小,则输出的多边形将更接近原始的形状,包括规则的起伏。 在进行矩形检测时,可以先使用Canny边缘检测算子
    发表于 11-01 09:23

    opencv写好的算子,比如找边 找圆 模版匹配

    opencv写好的算子,比如找边 找圆 模版匹配
    的头像 发表于 10-16 09:54 263次阅读

    迅为RK3568开发板Scharr滤波器算子边缘检测

    ()函数展示 x 方向梯度边缘检测计算之后的图像 8 scharry = cv2.Scharr(img,cv2.CV_64F,0,1) #使用 Sobel 算子进行边缘检测,数据类型设置为
    发表于 10-09 11:03

    迅为iTOP-RK3568开发板Sobel 算子边缘检测

    (索贝尔)算子计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。 索贝尔算子把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘
    发表于 09-18 10:27

    如何使用BMLang开发自定义的算子

    如何使用BMLang开发自定义的算子
    发表于 09-18 06:57

    图像锐化的Sobel、Laplacian算子基础知识介绍

    Sobel 算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导
    的头像 发表于 09-13 09:52 793次阅读
    图像锐化的Sobel、Laplacian<b class='flag-5'>算子</b>基础知识介绍

    PRelu算子调优经历-函数优化策略

    上一篇小编和大家分享了在运行客户的一个模型时遇到了一个PRelu算子,在利用TFLm自带的PRelu参考实现的代码,其中PRelu竟然抛出了188ms的天文数字...因此小编开始准备PRelu算子
    的头像 发表于 08-24 08:50 570次阅读
    PRelu<b class='flag-5'>算子</b>调优经历-函数优化策略

    什么是PRelu算子?PRelu算子调优经历-先行篇

    一个叫做PRelu的算子,想要运行在RT170上。 本来小编是信心满满的答应客户说: 速度上放心,我们这主频1GHz的CPU绝对没问题,包您满意。 没想到跑分结果出炉直接给了小编沉重一击。 直接依赖
    的头像 发表于 08-24 08:50 787次阅读
    什么是PRelu<b class='flag-5'>算子</b>?PRelu<b class='flag-5'>算子</b>调优经历-先行篇

    如何给TPU-MLIR添加新的算子

    如何给TPU-MLIR添加新的算子
    的头像 发表于 08-18 11:29 355次阅读
    如何给TPU-MLIR添加新的<b class='flag-5'>算子</b>

    机器学习算法的5种基本算子

    机器学习算法的5种基本算子 机器学习是一种重要的人工智能技术,它是为了让计算机能够通过数据自主的学习和提升能力而发明的。机器学习算法是机器学习的核心,它是指让计算机从数据中进行自主学习并且可以实现
    的头像 发表于 08-17 16:11 1336次阅读