基于FPGA的Canny算子设计(一)

Canny算子计算流程:

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

非最大值一直电路设计

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

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

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

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

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

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

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

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

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

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

上式中,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方向的输出,以及模值输出,实际上并不需要方向计算。

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

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

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

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

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2017-10-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT杂记

根据两经纬度点计算距离公式推导

已知地球上的点E经纬度为(J1, W1),点F经纬度为(J2, W2),求两点间最短的球面距离。

3839
来自专栏云时之间

深度学习与TensorFlow:关于DBN的一些认识

最近在学习深度置信网络(DBN)的时候,看过几篇博客,但是在DBN的结构上,一大堆博客讲DBN是将受限玻尔兹曼机(RBM)像砖块一样叠加起来的一个网络,这本身是...

1614
来自专栏崔庆才的专栏

TensorFlow验证码识别

本节我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里我们识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,...

5236
来自专栏Python数据科学

5种方法教你用Python玩转histogram直方图

直方图是一个可以快速展示数据概率分布的工具,直观易于理解,并深受数据爱好者的喜爱。大家平时可能见到最多就是 matplotlib,seaborn 等高级封装的库...

4421
来自专栏小樱的经验随笔

从零基础学三分查找

今晚是我们学长第二次讲课,讲了一个三分!认真听了一下,感觉不是很难,可能会比二分还简单些!我就把上课讲的内容归纳为一篇文章概述吧!以后也会重点讲解的! 简单点说...

44510
来自专栏python读书笔记

python 数据分析基础 day18-使用pandas进行数据清洗以及探索

今天是读《python数据分析基础》的第18天,读书笔记的内容是使用pandas进行数据清洗以及探索 由于原始数据在某种程度上是“脏”的,原始数据并不能完全使...

5818
来自专栏一棹烟波

OpenCV角点检测源代码分析(Harris和ShiTomasi角点)

OpenCV中常用的角点检测为Harris角点和ShiTomasi角点。 以OpenCV源代码文件 .\opencv\sources\samples\cpp\t...

6236
来自专栏ml

nyoj-----幸运三角形

幸运三角形 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述         话说有这么一个图形,只有两种符号组成(‘+’或者‘-’...

30410
来自专栏DannyHoo的专栏

iOS开发中使用算法之冒泡法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

1153
来自专栏机器学习原理

我的机器学习numpy篇何为ndarray?ndarry创建生成正态分布ndarry属性修改形状ndarry运算ndarry切片矩阵转置聚合函数

前言: numpy是以矩阵为基础的数学计算模块,其基础为多维数组为ndarray 官方文档:(https://docs.scipy.org/doc/nump...

3988

扫码关注云+社区

领取腾讯云代金券