目录
先读为快,以结果为导向,本期介绍Canny图像算法仿真验证,后续将介绍canny算法原理与实现,欢迎持续关注,FPGA自习室 公众号设置星标,不错过每一次推送~
一、简要说明
1.1 算法流程
Canny边缘检测是一种非常流行的边缘检测算法,是John Canny在1986年提出的。它是一个多阶段的算法,即由多个步骤构成:图像降噪、计算图像梯度、非极大值抑制。
第一步,图像降噪。
我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。
第二步,计算图像梯度,得到可能边缘。
我们在前面的关于《图像梯度》文章中有所介绍,计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。
第三步,非极大值抑制。
通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。
第四步,双阈值筛选。
通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。
这样做的目的是只保留强边缘轮廓的话,有些边缘可能不闭合,需要从满足low和high之间的点进行补充,使得边缘尽可能的闭合。
参考文章:https://blog.csdn.net/likezhaobin/article/details/6892176
1.2 验证流程:
搭建一个视频流Modelsim仿真,在基于FPGA视频图像算法开发过程中,最终目的是为了把摄像头实时视频数据经过一系列的图像算法,通过显示设备显示出来;在开发过程中,我们不能总是在FPGA板子上在线调试,一个是耗时时间长;另一个是不容易找出错误,因此,有必要模拟一个视频时序,用来验证算法,并有效的利用Matlab工具把静态图片“打散”保存到txt文本里,供Modesim读取,然后通过Matalb“复现”处理后的文本。
二、操作步骤
第一步:获取图像
截取len图片,格式为bmp
这里使用上张len图设置了一种分辨率 640X480,如果不是,这里可用画图软件打开图片可以修改分辨率
第二步:Matlab产成图像
my_image_gen.m 读取的len.bmp的彩色图像,matlab运行后,将使用matlab函数灰度化的灰度图像数据写进,image_data.txt。
第三步:Modelsim仿真路径设置
仿真工程打开的正确方式:
方法1:保证仿真工程正常打开,解压后文件需要 放在新建和原路径一样的路径。
方法2:不需要新建相同路径,需要文本打开并修改仿真工程里的 *.mpf 绝对路径。
方法3:使用自动仿真脚本。
第四步:开始仿真
1) 打开modelsim 仿真工程,找到work
2)然后找到tb_image_canny功程名,右键 simmulate 到仿真页面
3)最后点击黄色按键,全速仿真,结束会自动停止。
第五步:matlab 查看图像
上一步仿真结果会出现三个txt文件:canny_data.txt 、Gs_data_out.txt、sobel_data_out.txt
直接运行my_image_show.m 即可
测试结果: