大家好:我是毛华望。目前在参加紫光同创PGL22G开发平台试用。连载第5篇。
现在我们要开始做最难的内容了。就是边缘检测算法的实现。
数学实现是这样的。
换成程序的写法的话。
这里我提供一个关于sobel的网站
https://wenku.baidu.com/view/677ab87602768e9951e73878.html
这里基本囊括了所有的内容。这里的主要战场是FPGA的实现。关于sobel的内容就自行百度补充一下知识吧。
第一部分:程序篇。
目前还在程序编程和仿真过程。上班测试过程之后才会用到。过。
第二部分:matlab篇。
图片还是要的。提供图片。
我给它命名为girl.png
然后搭建编译环境。
开始编程:
我上面给的网站里面基本包括了程序的全部细节。
程序看起来比较简单。Size来获取长和宽。
然后用之前的2个算子进行每个点的计算。 For循环里面的2 和H-1就是把照片的尺度缩小了一个像素。
看我最后改写的程序成品。
整套程序进来。
成品效果图。
这个是网站提供的sobel处理后的图片。为何和我的不样啊。其实只要改变一下黑白就可以了。
差不多了吧。比如说:你感觉网站上的细节比较多的话。就是THRESHOLD这个阈值的设定了。
网站上已经提供了大部分材料,调试起来问题不大。细节调一下就知道了。
为何要先matlab去实现一下吗?
当然你也可以这样。直接使用edge函数, I5是图像数据。 Sobel算子选定。BW1就是结果。可是我们最终是要用FPGA是实现的,所以,要将sobel算法,用计算的方式去实现。也方便验证了,FPGA是不是真的可以实现。
第三部分:modelsim仿真
Matlab实现就很容易的算法。FPGA实现起来可能就很难了。比如说:求除法啊,求sin或者tan等。不过sobel里面,只有正负号的处理,绝对值的处理。就容易很多了。
本人能力有限,所以,还是比较喜欢用modelsim仿真完成。就不直接上调试了。
因为这里涉及到的负数,和绝对值。先说说负数部分
FPGA程序基本上和matlab的程序是一样的。看起来很像吧。
$signed是有符号的意思,程序里面使用了有符号的加减法。
仔细看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]; 也是可以的。
程序里面使用了绝对值操作。
那绝对值呢??? 4’b1110 = -2 。绝对值 4’b0010 = 2 。也就是4’d0 – 4’b1110 = 2.
这里直接用了 x>=0 的方法。其实也可以 x[10]是否为1. 选择取反。
仿真文件来一个。
循环几遍试一下。
这个是仿真的结果。
显示的数据是无符号10进制。所以,DX,DY,有可能是很大的值。是因为负数的原因。
详细查看仿真波形图。并没有太大的问题。
到此,边缘检测算法sobel,matlab验证算法,到modelsim仿真大体上已经没有问题了。接下来的一篇综合篇,就准备把串口组件和边缘检测的组件合并在一起了。联合调试整个功能就算结束了。其实我就是把串口来替代摄像头和显示器。将来想实时显示效果的话,把接口部分替换一下就可以了。
扫码免费申请试用
紫光同创PGL22G开发平台试用连载(1)---软件和器件
紫光同创PGL22G开发平台试用连载(2)---基本流程dome
紫光同创PGL22G开发平台试用连载(3)---重点功能初探
紫光同创PGL22G开发平台试用连载(4)---边缘检测之串口通信篇
紫光同创PGL22G开发平台试用连载(1)-FPGA参数分析和对比
紫光同创PGL22G开发平台试用连载(2)---PDS软件试用
紫光同创PGL22G开发平台试用连载(3)---在FPGA上实现DW8051 MCU