【问题标题】:Python - Detecting desired corners of a imagePython - 检测图像的所需角落
【发布时间】:2018-03-26 09:22:54
【问题描述】:

我需要帮助我编写能够检测图像角点的算法的 Python 编码。到目前为止,我有一个阈值图像,我正在使用 opencv 中的cornerHarris 来检测所有角落。我的问题是过滤所有这些点以仅输出我想要的点。也许我可以做一个循环来实现这一点?

就我而言,我想要两个最低角点和两个最高角点。我的主要兴趣是获取这个角的像素坐标。您可以在此处查看我正在处理的图像示例:

在这张图片中,我绘制了我感兴趣的角点。

【问题讨论】:

  • 如何根据y值排序,找到2个最低极值和2个最高极值对应点。
  • 我已经设法检测到角落,现在我将按照您的建议提取我感兴趣的那些。谢谢!

标签: python opencv image-processing corner-detection


【解决方案1】:

有几种方法可以解决这个问题。在现实世界的应用程序中,您需要为单个图像解决一次问题的情况很少见(也就是说,实际上从未发生过)。如果您有其他图片,很高兴看到感兴趣的对象有多大变化。

找到角点的一种方法是凸包。这种方法更普遍地用于寻找包含散点的凸形,但值得了解和实施。

https://en.wikipedia.org/wiki/Convex_hull

凸包的方便之处在于“角”(凸包多边形上的一个顶点)的概念很容易掌握并且不依赖于参数设置。您不必考虑拐角是否足够锋利、足够坚固、足够尖、在其附近是否独一无二等等——凸包对您来说很有意义。

您应该能够在合理的时间内编写凸包“礼物包装”算法的功能版本。

https://en.wikipedia.org/wiki/Gift_wrapping_algorithm

有很多方法可以计算凸包,但不要迷失在所有不同的方法中。选择一个对你有意义的并实施它。已知最快的方法可能仍然是 Seidel,但不要考虑跑下那个兔子洞。简单就好。

在计算凸包之前,您需要将白色形状缩小为边缘点;否则,船体算法将检查太多的点。减少要考虑的点的数量可以使用连接组件(白色“斑点”)上的边缘查找、无需先从背景分割前景的边缘查找或任何各种简单内核(例如 Sobel)来完成。

虽然该算法称为“凸”外壳,但您的形状不一定是凸的,尤其是当您只对示例图像中所示的顶部和底部顶点/角感兴趣时。

坦率地说,角落查找器可能有点令人失望,特别是因为顾名思义,“嘿,它总是会找到角落。”那里有一些不错的选择,但是您可能会花费大量时间来研究所有替代方案。即使这样,您也可能必须设置阈值,考虑您的应用程序是否会在给定角的形状和比例等情况下偶尔产生奇怪的结果,等等。

虽然你提到只想找到顶部和底部点,但如果你想找到左侧那两个奇怪的三角形露头,那么找角会变得有点复杂;使用凸包使这变得非常简单。

虽然您希望找到一个稳健的角点检测解决方案,最好使用性能易于理解的已知算法,但您也希望避免过度概括。无论如何,请查看一些角落探测器列表,看看您喜欢什么。如果您看到一个看起来很容易实现的有前途的算法,为什么不尝试实现它呢?

https://en.wikipedia.org/wiki/Corner_detection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    相关资源
    最近更新 更多