canny代码移植调试体会

将基于mat数据结构的非极大值抑制算法和磁滞阀值算法修改成2 维array的非极大抑制和磁滞阀值调试体会

1、非极大值抑制输入参数bit位个数不一致,尤其变小了,导致一部分数据丢失,影响中间处理过程,导致结果不正确

首先输入梯度和梯度方向,输出强弱边缘标志图像指针;输入梯度参数mat结构是32位的梯度值,改成二维数组变成了8bit的梯度值,所以梯度值的被截去了高字节,导致低于最小阈值,最终输出黑屏。

2、非极大值抑制输出参数的bit位个数不一致,同样也是改小,导致bit个数不够,数据丢失,这个会影响到下一步运算:

图像的行列索引,不小心用了unsigned char,导致行宽大于256都被截断。

我的体会,就是每一步骤都要打断点调试,首先不要眉目胡子一把抓的调试,这样定位不是很准确。调试一个算法函数是否正确,首先保证输入一样参数,看看输出图像是否一样,再查看输出数据是否一样,每一个相关输出数据都要认真对照,首先看一下bit位,然后理解一下算法原理,基本上都能对上。这一步输出是下一步输入,同样保证下一步输入是一致,这样可以方向理解一下下一步算法。调试代码一定耐下心一步一步调试,打印出来文本进行对比,再返回头看代码,逐步缩小范围,定位问题。

这里增加deque的打印,需要了解一下deque的用法,

std::Deque使用总结_大山喵写博客的地方-CSDN博客

3、非极大值抑制输出一致,但是经过磁滞阈值化最后还是错误

原来算法是所有的强边界周围的弱边界点都变成强边界点,同时变成新强边界点的弱边界点,其周围需要进一步判断是否是弱边界点,直到没有弱边界点。我理解成了强边界周围的弱边界点变成强边界点就行了,导致边界点没有被连接起来。

 

上一篇:ITK:使用Canny边缘检测过滤器检测边缘


下一篇:canny边缘检测算法的原理