在上一篇FPGA图像处理--Canny边缘检测(一)里介绍了Canny边缘检测的NMS计算,这里就介绍一下双阈值边缘检测和弱边缘连接。
双阈值检测顾名思义就是要有两个阈值,在Sobel中只有一个阈值,这样就可能带来一些潜在的问题,比如阈值设置过低导致检测出来的边缘很多,或者设定的过高导致检测出来的边缘比较少。
在Canny中引入了双阈值检测,也就是定义一个高阈值和一个低阈值。当边缘的幅值大于高阈值的时候就认为这个边缘是一个强边缘,低于低阈值的时候就认为他不是边缘,而在高阈值和低阈值之间的值被认为是弱边缘。通过后面的弱边缘连接就可以让弱边缘有可能被识别为边缘,也有可能被忽视掉。从而带来更好的检测效果。
我们来看一下Python的参考模型:
这里定义了一个函数来处理双阈值的问题,当像素的值大于等于高阈值的时候就设置当前像素为255,介于低阈值和高阈值之间的值设置为127,小于低阈值的值设置为0,这个就很简单了。
我们来看一下效果吧。
可以看到边缘信息都被很好的检测出来了,但是有的边缘是断断续续的,这个时候就需要使用弱边缘连接了。
最理想的弱边缘连接肯定是做一遍深搜,但是这个对于资源消耗太大了,那么我们就退而求其次,如果一个点是弱边缘的话,只要他周围八个点里面有一个是强边缘,那么我们就把这个点变为强边缘。是不是很简单。
来看看Python的参考模型:
只要当前值是127也就是我们在第一步中分离出来的弱边缘,然后做一个判断,判断他周边有没有强边缘,来决定是否将其变为强边缘点。
我们来看一下做了一次弱边缘连接的效果:
大家注意看红色框里面的这部分,可以看到一部分边缘相对于之前已经连接了起来。
如果我们多做几次弱边缘连接效果肯定会更好,不过与之带来的就是计算成本的增加。
这里通过一个循环来控制做弱边缘连接的次数。
来看一下弱边缘连接改为五次的效果,可以看到效果比之前更好一点。
再来看一下不做高斯模糊的效果,可以看到有很多的噪点:
最后来展示下所有的效果图,分别是原图,sobel,nms,canny后的结果:
参考模型到这里就介绍完毕了,之后就是用Verilog来实现它。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !