有几种方法可以解决这个问题。在现实世界的应用程序中,您需要为单个图像解决一次问题的情况很少见(也就是说,实际上从未发生过)。如果您有其他图片,很高兴看到感兴趣的对象有多大变化。
找到角点的一种方法是凸包。这种方法更普遍地用于寻找包含散点的凸形,但值得了解和实施。
https://en.wikipedia.org/wiki/Convex_hull
凸包的方便之处在于“角”(凸包多边形上的一个顶点)的概念很容易掌握并且不依赖于参数设置。您不必考虑拐角是否足够锋利、足够坚固、足够尖、在其附近是否独一无二等等——凸包对您来说很有意义。
您应该能够在合理的时间内编写凸包“礼物包装”算法的功能版本。
https://en.wikipedia.org/wiki/Gift_wrapping_algorithm
有很多方法可以计算凸包,但不要迷失在所有不同的方法中。选择一个对你有意义的并实施它。已知最快的方法可能仍然是 Seidel,但不要考虑跑下那个兔子洞。简单就好。
在计算凸包之前,您需要将白色形状缩小为边缘点;否则,船体算法将检查太多的点。减少要考虑的点的数量可以使用连接组件(白色“斑点”)上的边缘查找、无需先从背景分割前景的边缘查找或任何各种简单内核(例如 Sobel)来完成。
虽然该算法称为“凸”外壳,但您的形状不一定是凸的,尤其是当您只对示例图像中所示的顶部和底部顶点/角感兴趣时。
坦率地说,角落查找器可能有点令人失望,特别是因为顾名思义,“嘿,它总是会找到角落。”那里有一些不错的选择,但是您可能会花费大量时间来研究所有替代方案。即使这样,您也可能必须设置阈值,考虑您的应用程序是否会在给定角的形状和比例等情况下偶尔产生奇怪的结果,等等。
虽然你提到只想找到顶部和底部点,但如果你想找到左侧那两个奇怪的三角形露头,那么找角会变得有点复杂;使用凸包使这变得非常简单。
虽然您希望找到一个稳健的角点检测解决方案,最好使用性能易于理解的已知算法,但您也希望避免过度概括。无论如何,请查看一些角落探测器列表,看看您喜欢什么。如果您看到一个看起来很容易实现的有前途的算法,为什么不尝试实现它呢?
https://en.wikipedia.org/wiki/Corner_detection