找到周围的矩形区域,并在其中给出一条线

时间:2018-08-15 20:53:31

标签: python opencv matplotlib annotations computer-vision

我的问题仅与OpenCV / Matplotlib有关。但是,要理解这个问题,我需要学习几行ML /计算机视觉方面的内容:

我正在研究平面图数据集上的图像分割问题。我将使用完全卷积网络(FCN)。

现在,FCN需要一张图像,一个对应的分段图像。 例如:

image and its groundtruth

左侧的图像是实际图像,而右侧的图像是图像的正确“注释”。本质上,每个对象(类)都完全充满了自己的颜色-汽车,道路,建筑物等。

现在,就我而言,我正在处理平面图数据。平面图示例如下所示:

Example floorplan image

此类图像中的相关实体是墙壁,门等。

问题我已经为一大堆此类图像添加了数据注释,但是上面的表格中没有注释数据。墙用简单的线条标注---这意味着它们仅1px厚,并且实际上并未填充实际图像中墙的面积/厚度。请参见以下示例:

Annotated Data I have

请参阅上图左上角代表墙壁的2条线。当墙很粗时,我作为注释数据仅是那些粉红色的1px粗线。

但是,我所需要的实际上是完全填充墙壁区域。例如:

Ground truth I want

我现在要以编程方式将这些线转换为填充区域,即基于每条墙的线数据,我希望创建这些线所在的墙的填充版本。

所以,本质上来说,问题是这样的: 如果我在矩形区域内有一条细线,我能以某种方式获得它所代表的整个矩形区域吗?如果可以的话,可以用它的颜色填充它,并可以注释它的使用方式。

我们可以做出一些假设: -线条将始终代表其所在的墙 -墙通常是较粗的线,与其余图像相比只有一些暗色

再次注释数据将是非常困难且昂贵的,因此,我想问这个问题,以防可以通过编程方式实现。

我对opencv和matplotlib的知识很薄,因此这可能是一个新手问题。这可能是一件非常非常简单的事情。在这种情况下,请让我知道需要继续学习的算法或函数。

谢谢。

2 个答案:

答案 0 :(得分:2)

通常,您可以为此使用简单的“填充”算法,如Mariana的回答中所建议。但是,您只需要延伸到给定的线,就不能继续沿着该办公区域的西墙延伸。我假设每个最终结果都是与绘图轴对齐的矩形。

相反,您需要“波前”填充:将 entire 线向北和向南延伸(线尺寸大于单个像素),直到所有 为灰色。然后对东西方向做同样的事情。您可以通过将行复制到相邻的像素行/列来执行扩展。

我不知道直接支持此功能的软件包,但大多数都会进行矢量化粘贴复制或等效更改。

答案 1 :(得分:1)

编辑我的答案以涵盖@Prune条件。 我可能会尝试一些逻辑,例如:

  1. 找到粉红色的线条。。为此,您可以看一下:how to detect lines in opencv。这部分的结果是一个数组,其中包含检测到的线段的端点。
  2. 查找每种线的方向。考虑一条线的端点: [x1; y1] [x2; y2] 。如果(x2-x1)>(y2-y1),则该线是水平的。否则,该线是垂直的。
  3. 查找新端点。如果线是水平的,则从“最左”(较小的x)端点向左移动,直到找到深灰色像素。找到它后,它将是您的新左端点( x1')。对“最右”(较大的x)端点执行相同的操作,这次向右移动,因此找到 x2'如果线是垂直的,请从下端(y较小)向下移动,直到找到深灰色像素。找到它后,它将是您的新较低端点( y1')。对上(较大的y)端点进行相同的操作,这次向上移动,所以您找到 y2'
  4. 绘制矩形,以便绘制新墙。如果墙的宽度恒定并且粉红色的线条居中,则可以从此处简单地绘制矩形。 如果线是水平的,则矩形的左上角坐标为 [x1'; y1 +壁宽的一半] ,右下角坐标为 [x2';壁宽的y2-一半] 如果线是垂直的,矩形的左上角坐标为 [壁宽的x1-一半; y1'] ,右下角坐标为 [x2;壁宽的y2'-一半]

让我知道是否满足第四个条件。例如,在这种情况下,对于水平线,我们需要沿着水平线向上/向下迭代,寻找暗像素之间的较小距离,然后获取此y坐标以帮助绘制矩形。