【问题标题】:Finding the angle of stripeline/ Angle of rotation找到条纹线的角度/旋转角度
【发布时间】:2013-02-13 12:00:09
【问题描述】:

因此,我试图找出所附照片等图像中条纹线的旋转角度。 唯一的假设是这些线是平行的,并且它们的方向大约或多或少约为 90 度[例如 5 度公差]。 我必须确保结果图像中的条纹线垂直 %100。图像的质量以及它们的直方图/灰度值不同。所以基于非自适应阈值的方法对于我的案例已经失败了[如果我不能使其自适应,我对基于阈值的方法不感兴趣]。此外,条纹线顶部有时会出现一些随机的黑色簇。

到目前为止我做了什么: 1)当然,HoughLines 是第一个选项,但我无法让它适用于我的所有图像,尽管遵循了这篇很棒的文章,但我取得了部分成功: http://felix.abecassis.me/2011/09/opencv-detect-skew-angle/。 我理解失败的主要原因是,我需要为不同的图像微调参数。 Canny/BW/Morphological边缘检测等参数(如果需要) | minLinelength/maxLineGap/等的参数。当然有办法破解它并让它工作,但是,对我来说,这是一个脆弱的解决方案!

2) 我现在正在做的是将图像划分为顶部切片和底部切片,然后找到每个切片的峰和谷。然后基本上使用图像的宽度和峰的平移来找到角度。我目前正在寻找顶部切片的哪个峰值属于底部切片的哪个峰值,因为由于带状线顶部存在黑色/白色簇,我的计算中会出现一些误报峰值。

示例:切片的峰值位置: 顶部切片 = { 1, 33,67,90,110} BottomSlice = { 3, 14, 35,63,90,104}

在提取峰值时,我实际上得到了相似的向量。可以看出,向量的长度可能会有所不同,知道如何获得这样的组:

{{1,3},{33,35},{67,63},{90,90},{110,104}}

我对改进这些算法或全新方法的任何想法持开放态度。如果需要,我可以上传更多图片。

【问题讨论】:

  • 只是想知道,这是微米级光栅吗?
  • 你是对的,是的。

标签: algorithm matlab opencv image-processing


【解决方案1】:

如果您可以获得单条线的点列表,linear regression 将为您提供最适合这些点的直线的公式。一个简单的三角运算将直线公式转换为角度。

您可能可以使用一些细线操作将条纹变成点列表。

【讨论】:

  • 谢谢马克。对我来说听起来很棒,虽然它有点太贵了。如果我错了,请纠正我。所以,我们基本上需要每行更多的样本,这意味着更多的图像切片和更多的峰值检测。到目前为止还不错,但现在我将拥有例如5 个数组类似,类似于我们的 TopSlice = { 1, 33,67,90,110},其中第一个元素可能代表第一行。 “Non-OK”部分是,我应该为每条线运行迭代算法,例如线性回归吗?这会非常昂贵。
  • @Hamed 如果你知道一行代表整张图片,那么就不需要对所有图片都运行算法。
  • 你是对的,但我认为我应该使用我拥有的数据而不是过滤掉很多有用的点。至少我可以有一个更好的近似值。无论如何,线性回归不是 %100 准确的。就像一个想法,类似en.wikipedia.org/wiki/RANSAC的算法怎么样。我基本上是在尝试以更少的迭代使用更多的数据点!我知道我的想法并不清楚,这只是一个想法......
  • @Hamed,只要异常值很少,线性回归就非常健壮,无需使用 RANSAC 之类的东西。如果你还没有弄清楚,这个建议属于“全新方法”类别。
【解决方案2】:

您可以沿不同角度运行空间导数的累加器。如果您想要半度精度和 5 行样本,则最多有 10*5*1500 = 7.5m 次迭代。您可以安全地将沿线的采样率降低十倍,这将为您提供每个样本 150 个点的样本大小,从而将迭代次数减少到不到一百万。在该点附近的某个地方,拉直图像的操作应该成为瓶颈。

【讨论】:

  • 感谢您分享您的想法。您认为在此类图像上比较此类窄导数的结果是否可行?
  • 简而言之是的,但我相信如果你尝试一下,你会告诉我们的。
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2012-11-03
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多