所以我试图在图像中找到条纹线的旋转角度,如附图。 唯一的假设是线条是平行的,它们的方向约为90度,大约或多或少[比如5度公差]。 我必须确保结果图像中的条纹线为%100垂直。图像质量以及直方图/灰度值都有所不同。因此,基于非自适应阈值处理的方法对于我的情况已经失败[如果我不能使其自适应,我对基于阈值的方法不感兴趣]。此外,条纹线顶部有一些随机的黑色簇。
到目前为止我做了什么: 1)当然HoughLines是第一个选择,但我不能使它适用于我的所有图像,虽然遵循这篇伟大的文章我有一些部分的成功: http://felix.abecassis.me/2011/09/opencv-detect-skew-angle/。 我理解失败的主要原因是,我需要微调不同图像的参数。 Canny / BW / Morphological边缘检测等参数(如果需要)| minLinelength / maxLineGap / etc的参数。当然,有一种方法可以解决这个问题并让它发挥作用,但对我而言,这是一个脆弱的解决方案!
2)我现在正在做的是将图像分成顶部切片和底部切片,然后找到每个切片的峰和谷。然后基本上使用图像的宽度和峰的平移来找到角度。我正在努力寻找顶部切片的哪个峰属于哪个底部切片,因为在我的计算中会出现一些假阳性峰,因为在条带线的顶部存在黑/白簇。
示例:切片峰的位置: 顶部切片= {1,33,67,90,110} BottomSlice = {3,14,35,63,90,104}
我在提取峰时实际上得到了类似的向量。可以看出,矢量的长度可能会有所不同,任何想法我怎么能得到像这样的组:
{{1,3},{33,35},{67,63},{90,90},{110104}}
我对改进任何这些算法或全新方法的想法持开放态度。如果需要,我可以上传更多图片。
答案 0 :(得分:1)
如果您可以获得单行的点列表,linear regression将为您提供最适合点的直线公式。简单的trig操作会将线公式转换为角度。
您可以使用一些线条细化操作将条纹转换为点列表。
答案 1 :(得分:0)
您可以沿不同角度运行空间导数的累加器。如果您想要半度精度和5行样本,则最多可以进行10 * 5 * 1500 = 7.5m的迭代。您可以安全地将采样率沿着十倍线减少,这将为您提供每个样本150个样本的样本量,从而将迭代次数减少到不到一百万次。在这一点上,矫正形象的操作应该成为瓶颈。