我必须在c#中检测黑色背景上的白色多边形的所有点。这是几个例子的图像。我不认为这太难了,但我无法通过所有变化来正确检测到这一点。我的代码太多了,不能在这里发布,但基本上我经历了每一面,并寻找它何时从黑白变化。我应该使用Open CV吗?我希望能在C#中实现一个简单的算法。有什么建议?谢谢。
答案 0 :(得分:1)
在你的情况下,我会这样做:
预处理图片
因此,如果存在色彩噪音(如 JPG 失真等)并将图像二值化。
选择圆周像素
简单地遍历所有像素并将具有至少一个黑色邻居的每个白色像素设置为将代表您的周长 ROI 蒙版的不同颜色,或者将像素位置添加到某些点列表中。 / p>
应用关联组件分析
所以你需要找出点的顺序(如何连接在一起)。最简单的方法是使用第一个找到的像素的 ROI 泛洪归档,直到所有 ROI 都填满并记住填充点的顺序(类似于 A * 强>)。在某些时候应该有两条不同的路径,两者都应该最后加入。因此,确定这两个点并构建圆周点顺序(通过反转一半并处理共享部分,如果存在)。
查找顶点
如果计算所有后续像素之间的角度变化,那么在直线上,角度变化应该接近零并且顶点附近要大得多。那么阈值,你得到了你的顶点。为了使这个强大,您需要从更远的像素然后最近的像素计算倾斜角度。此阈值变化与滑动平均值的阈值通常也能提供更稳定的结果。
因此,找出像素应该在多大程度上计算角度,这样你就不会有太大的噪音,顶点仍然有很大的峰值,并且还能找到比任何噪音更安全的阈值。
这也可以通过 hough transform 和查找轮廓函数来完成,这些函数存在于许多 CV 库中。另一种选择是直接回归/拟合点列表中的线,并计算可提供子像素精度的交点。
有关详细信息,请参阅相关的质量检查: