紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

毛华望 提交于 周四, 08/13/2020
紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

大家好:我是毛华望。目前在参加紫光同创PGL22G开发平台试用。连载第5篇。

现在我们要开始做最难的内容了。就是边缘检测算法的实现。

数学实现是这样的。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

换成程序的写法的话。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

这里我提供一个关于sobel的网站

https://wenku.baidu.com/view/677ab87602768e9951e73878.html

这里基本囊括了所有的内容。这里的主要战场是FPGA的实现。关于sobel的内容就自行百度补充一下知识吧。

第一部分:程序篇。

         目前还在程序编程和仿真过程。上班测试过程之后才会用到。过。

第二部分:matlab篇。

         图片还是要的。提供图片。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

         我给它命名为girl.png

然后搭建编译环境。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

开始编程:

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

我上面给的网站里面基本包括了程序的全部细节。

程序看起来比较简单。Size来获取长和宽。

然后用之前的2个算子进行每个点的计算。  For循环里面的2 H-1就是把照片的尺度缩小了一个像素。

看我最后改写的程序成品。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

整套程序进来。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

成品效果图。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

这个是网站提供的sobel处理后的图片。为何和我的不样啊。其实只要改变一下黑白就可以了。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

差不多了吧。比如说:你感觉网站上的细节比较多的话。就是THRESHOLD这个阈值的设定了。

网站上已经提供了大部分材料,调试起来问题不大。细节调一下就知道了。

为何要先matlab去实现一下吗?

当然你也可以这样。直接使用edge函数, I5是图像数据。  Sobel算子选定。BW1就是结果。可是我们最终是要用FPGA是实现的,所以,要将sobel算法,用计算的方式去实现。也方便验证了,FPGA是不是真的可以实现。

第三部分: modelsim仿真

     Matlab实现就很容易的算法。FPGA实现起来可能就很难了。比如说:求除法啊,求sin或者tan等。不过sobel里面,只有正负号的处理,绝对值的处理。就容易很多了。

     本人能力有限,所以,还是比较喜欢用modelsim仿真完成。就不直接上调试了。

     因为这里涉及到的负数,和绝对值。先说说负数部分

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

FPGA程序基本上和matlab的程序是一样的。看起来很像吧。

$signed是有符号的意思,程序里面使用了有符号的加减法。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

仔细看O[X][X]本身,并没有负数, reg              [7:0]   O[0:2][0:2];而且定义变量里面也没有加signed的标示。 但是DX本身是有符号的。reg signed [10:0]   Dx, Dy;

为了运行正常,所以,Dx计算过程中也添加了signed的标示。

如果说你不想在计算Dx的过程中添加signed标示的话。可以这么写。

reg signed   [7:0]     O[0:2][0:2];  也是可以的。

程序里面使用了绝对值操作。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

那绝对值呢??? 4’b1110 = -2 。绝对值 4’b0010 = 2 。也就是4’d0 – 4’b1110 = 2.

这里直接用了  x>=0 的方法。其实也可以 x[10]是否为1. 选择取反。

仿真文件来一个。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

循环几遍试一下。

紫光同创PGL22G开发平台试用连载(5)---边缘检测之算法篇

这个是仿真的结果。

显示的数据是无符号10进制。所以,DX,DY,有可能是很大的值。是因为负数的原因。

详细查看仿真波形图。并没有太大的问题。

到此,边缘检测算法sobelmatlab验证算法,到modelsim仿真大体上已经没有问题了。接下来的一篇综合篇,就准备把串口组件和边缘检测的组件合并在一起了。联合调试整个功能就算结束了。其实我就是把串口来替代摄像头和显示器。将来想实时显示效果的话,把接口部分替换一下就可以了。

相关文章

Digi-Key