我需要帮助python编码一个能够检测图像角落的算法。到目前为止,我有一个阈值图像,我正在使用opencv中的cornerHarris来检测所有角落。我的问题是过滤掉所有这些点,只输出我想要的那些点。也许我可以做一个循环来实现这个目标?
在我的情况下,我想要两个最低角和两个最高角点。我的主要兴趣是获得这个角落的像素坐标。您可以在此处查看我正在处理的图片示例:
在这张图片中,我绘制了我感兴趣的角点。
答案 0 :(得分:2)
有几种方法可以解决这个问题。在实际应用中,您需要为单个图像解决一次问题,这是罕见的(实际上从未发生过)。如果您有其他图像,那么很高兴看到感兴趣的物体有多大差异。
寻找角落的一种方法是凸包。这种方法更常用于找到包含散点的凸形,但值得了解和实现。
https://en.wikipedia.org/wiki/Convex_hull
关于凸壳的方便之处在于"角落的概念" (凸包多边形上的顶点)易于掌握,并且不依赖于参数设置。你不必考虑角落是否足够锋利,足够强大,足够尖,附近是否独特等等 - 凸壳对你来说是否有意义。
你应该能够编写一个凸包的功能版本"礼品包装"算法在合理的时间内。
https://en.wikipedia.org/wiki/Gift_wrapping_algorithm
计算凸包的方法有很多,但不要在所有不同的方法中丢失。选择一个对你有意义的并实现它。最快的已知方法可能仍然是赛德尔,但不要考虑跑掉那个兔子洞。简单就是好。
在计算凸包之前,您需要将白色形状减少到边缘点;否则船体算法会检查太多的点。减少要考虑的点数可以使用连接组件上的边缘查找(白色" blob"),边缘查找而无需先从背景中分割前景,或任何各种简单内核(例如索贝尔)。
虽然该算法被称为"凸"船体,你的形状不必是凸面的,特别是如果你只对样品图像中所示的顶部和底部顶点/角落感兴趣。
坦率地说,角落发现者可能会有点令人失望,特别是因为这个名字意味着,"嘿,它只会一直找到角落。"那里有一些好的,但你可以花很多时间调查所有的选择。即使这样,您也可能需要设置阈值,考虑您的应用程序是否会因角落的形状和比例而产生偶然的奇怪结果,等等。虽然你提到只想找到顶点和底点,如果你想在左侧找到那两个奇怪的三角形露头,那么找角会变得更复杂一些;使用凸包使这非常简单。
虽然您希望找到一种强大的角点检测解决方案,但最好使用可以轻松理解性能的已知算法,您还希望避免过度概括。无论如何,请查看一些角落探测器列表,看看你想要什么。如果您看到一个看起来很容易实现的有前途的算法,为什么不尝试实现呢?