【问题标题】:Algorithm to count stripes in a Image计算图像中条纹的算法
【发布时间】:2018-07-10 12:02:00
【问题描述】:

情况

我需要用我的 iPad 检测并计算图像中的这些条纹:

我正在使用 OpenCV,在将图像转换为灰度并均衡直方图后,我得到了这张图片:

当颜色低于某个值(灰度通常为 80)时,我会检查条纹。

问题

有时我有一些光线干扰,我得到这个图像:

我可以看到只有 2 个条纹,因为第三个可能是一些干扰并且没有定义,但是我的算法检测到 3 个条纹,因为颜色低于我的限制 (80)。我无法降低限制,否则我将无法检测到其他图像中的条纹。

有人对如何实现在第一张图像中检测 3 个条纹和在第二张图像中检测 2 个条纹的算法有一些建议?也许不是基于颜色限制,而是基于一些不同的东西,比如衍生物。

甚至只接受想法、不同的语言或伪代码

【问题讨论】:

  • 导数听起来是个好主意,您可以尝试这样做,检查对比边缘而不是较暗的颜色。我的意思是,“真实”条纹的边缘很短且对比鲜明,而“假”条纹的边缘被洗掉了很多。所以可能小部分的颜色差异可以为您提供更多信息,而不仅仅是颜色亮度
  • 我会尝试,但问题是并非总是有高对比度边缘(如在第一张图片中,如果你看到第三条条纹是白色 -> 灰色 -> 黑色 -> 灰色)。如果边缘被洗掉很多,我如何检测边缘是否短?你对算法的逻辑有什么建议吗?
  • 我的意思是,您可以使用样条曲线将这张图片近似为函数,然后使用渐变(或因为您的函数最有可能在一个变量上有所不同 - 它的数值导数)。从概念上讲,与您现在所做的没有真正的区别,但由于导数的限制性质,这可能会让您获得更准确的结果
  • 项目和阈值,然后你可以得到类似this
  • 使用具有大过滤器大小的自适应阈值。这样就行了。像This. 这样的东西。但内核更大。在该函数中将 11 更改为 51

标签: algorithm opencv image-processing


【解决方案1】:

我建议使用以下算法:

  1. 用每行的平均值制作单列图像。
  2. 遍历列并计算导数。
  3. 查找局部最小值和最大值(类似于 0 的导数)
  4. 由于条纹分布规律,您可以找到图案(最小值之间的灰尘相等)
  5. 计算找到的最大模式大小

编辑:我描述了类似的颜色算法。您可以以类似的方式使用最小值和最大值位置

https://stackoverflow.com/a/46446002/8682088

如果您有任何问题,请发表评论。

玩得开心!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多