Python - 检测图像的所需角点
Python - Detecting desired corners of a image
我在 python 编码能够检测图像角点的算法方面需要帮助。到目前为止,我有一个阈值图像,我使用 opencv 中的 cornerHarris 来检测所有角点。我的问题是过滤所有这些点以仅输出我想要的那些。也许我可以做一个循环来实现这个?
在我的例子中,我想要两个最低角点和两个最高角点。我的主要兴趣是获得这个角的像素坐标。您可以在此处查看我正在处理的图像示例:
在这张图片中,我画了我感兴趣的角点。
有几种方法可以解决这个问题。在 real-world 应用程序中,您需要为单个图像解决一次问题的情况很少见(也就是说,实际上从未发生过)。如果您有其他图像,很高兴看到感兴趣的对象有多少变化。
一种寻找角点的方法是凸包。此方法更常用于查找包含散点的凸形,但值得了解和实施。
https://en.wikipedia.org/wiki/Convex_hull
凸包的好用之处在于"corner"(凸包多边形上的一个顶点)的概念容易掌握,不依赖于参数设置。您不必考虑一个角是否足够尖锐、足够坚固、是否足够尖、是否在其邻域中独一无二等等——凸包对您来说很有意义。
您应该能够在合理的时间内编写凸包 "gift wrapping" 算法的函数版本。
https://en.wikipedia.org/wiki/Gift_wrapping_algorithm
计算凸包的方法有很多种,但不要迷失在所有不同的方法中。选择一个对你有意义的并实施它。已知最快的方法可能仍然是 Seidel,但甚至不要考虑 运行 那个兔子洞。简单就好。
在计算凸包之前,您需要将白色形状减少为边缘点;否则船体算法将检查太多点。减少要考虑的点数可以在连接的组件(白色 "blob")上使用 edge-finding,edge-finding 而不首先从背景分割前景,或任何各种简单的内核(例如索贝尔)。
尽管该算法称为 "convex" 船体,但您的形状不必是凸的,特别是如果您只对顶部和底部 vertices/corners 感兴趣,如示例中所示图片。
角落查找器可能有点令人失望,坦率地说,尤其是顾名思义,"Hey, it'll just find corners all the time." 那里有一些不错的查找器,但您可能会花很多时间研究所有替代方案。即使那样,您也可能必须设置阈值,考虑您的应用程序是否会在给定角的形状和比例的情况下偶尔产生奇怪的结果,等等。
虽然您提到只想找到顶部和底部点,但如果您想在左侧找到那两个奇怪的三角形露头,corner-finding 会变得有点复杂;使用凸包使这变得非常简单。
虽然您想找到角点检测的稳健解决方案,最好使用性能易于理解的已知算法,但您也希望避免过度概括。在任何情况下,查看一些角落检测器列表,看看你喜欢什么。如果您看到一个看起来 easy-ish 可以实现的有前途的算法,为什么不尝试实现它呢?
我在 python 编码能够检测图像角点的算法方面需要帮助。到目前为止,我有一个阈值图像,我使用 opencv 中的 cornerHarris 来检测所有角点。我的问题是过滤所有这些点以仅输出我想要的那些。也许我可以做一个循环来实现这个?
在我的例子中,我想要两个最低角点和两个最高角点。我的主要兴趣是获得这个角的像素坐标。您可以在此处查看我正在处理的图像示例:
在这张图片中,我画了我感兴趣的角点。
有几种方法可以解决这个问题。在 real-world 应用程序中,您需要为单个图像解决一次问题的情况很少见(也就是说,实际上从未发生过)。如果您有其他图像,很高兴看到感兴趣的对象有多少变化。
一种寻找角点的方法是凸包。此方法更常用于查找包含散点的凸形,但值得了解和实施。
https://en.wikipedia.org/wiki/Convex_hull
凸包的好用之处在于"corner"(凸包多边形上的一个顶点)的概念容易掌握,不依赖于参数设置。您不必考虑一个角是否足够尖锐、足够坚固、是否足够尖、是否在其邻域中独一无二等等——凸包对您来说很有意义。
您应该能够在合理的时间内编写凸包 "gift wrapping" 算法的函数版本。
https://en.wikipedia.org/wiki/Gift_wrapping_algorithm
计算凸包的方法有很多种,但不要迷失在所有不同的方法中。选择一个对你有意义的并实施它。已知最快的方法可能仍然是 Seidel,但甚至不要考虑 运行 那个兔子洞。简单就好。
在计算凸包之前,您需要将白色形状减少为边缘点;否则船体算法将检查太多点。减少要考虑的点数可以在连接的组件(白色 "blob")上使用 edge-finding,edge-finding 而不首先从背景分割前景,或任何各种简单的内核(例如索贝尔)。
尽管该算法称为 "convex" 船体,但您的形状不必是凸的,特别是如果您只对顶部和底部 vertices/corners 感兴趣,如示例中所示图片。
角落查找器可能有点令人失望,坦率地说,尤其是顾名思义,"Hey, it'll just find corners all the time." 那里有一些不错的查找器,但您可能会花很多时间研究所有替代方案。即使那样,您也可能必须设置阈值,考虑您的应用程序是否会在给定角的形状和比例的情况下偶尔产生奇怪的结果,等等。
虽然您提到只想找到顶部和底部点,但如果您想在左侧找到那两个奇怪的三角形露头,corner-finding 会变得有点复杂;使用凸包使这变得非常简单。
虽然您想找到角点检测的稳健解决方案,最好使用性能易于理解的已知算法,但您也希望避免过度概括。在任何情况下,查看一些角落检测器列表,看看你喜欢什么。如果您看到一个看起来 easy-ish 可以实现的有前途的算法,为什么不尝试实现它呢?