我正在使用EmguCV并尝试在图像中查找多边形。以下是有关该问题的一些事实:
1)多边形是不规则形状的,但两侧总是处于两个角度中的一个。
2)多边形通常在其侧面有需要填充的空隙。
3)如果多边形包含在另一个多边形中,我想忽略它。
考虑这张图片:
我想找到以红色突出显示的多边形,省略以绿色突出显示的多边形,并在间隙处建立连接,如蓝色所示:
我使用HoughLinesBinary取得了一些成功,然后将最近的线段端点相互连接以桥接间隙以构建完整的多边形,但是当涉及多个多边形时这不起作用,因为它会尝试绘制线条在多边形之间,如果它们碰巧彼此接近。
有人有什么想法吗?
答案 0 :(得分:0)
我认为问题可能是您的图像阈值。 我不知道你是怎么做的,但如果二进制图像更好,你可以得到更好的结果。
我喜欢连接多边形网段的想法,尝试确保您将连接的线路具有最大和最小长度,以避免连接到最近的对象。
验证新的线条关节是否形成90度角,即使它是一个角。
添加了: 您可以使用moephological运算符来增加与角度相关的线条。正如你所说,已知角度的线条使用这样的掩模进行扩张
0 0 0 1 1 0 0 0 0
这个面具只会生长线,直到与另一面相连。
答案 1 :(得分:0)
一般的解决方案很难,但对于您的特定问题,一个相对简单的启发式应该可行。
主要思想是使用墙壁一侧的白色像素作为附加功能。图像中的墙总是有一个近乎黑色的边,一边有许多白噪声像素。白噪声相对于墙壁的方向不会打开角落,因此使用此信息可以消除线条之间的许多可能连接。
首先是一些定义:
图片中的所有墙壁从左下角到右上角(上升线)或从左上角到右下角(下降线)。
如果下降线左侧有更多白色像素,请将其命名为 falling-left-wall ,否则为 fall-right-wall 。上升线也一样。
每一行以两点结束。调用最左边的一个开始,最右边的一个结束。
现在算法:
对图像中的每一行和每个起点/终点进行分类 检查每条线两侧的直接区域,并查看哪一侧包含更多白色像素 之后,您有一个标记为 falling-left-wall-start ,rising-left-wall-end等的点列表
每个开始/结束点:
从另一条线寻找附近的起点/终点
如果是 fall-left-wall-start ,则只查找:
一个左下方的墙
左上角开始,如果该点位于当前行的左侧
如果该点位于当前行的右侧,则为右上方的墙端
选择找到的点中最近的点,将其连接到当前点。