【问题标题】:Finding the surrounding rectangular region given a line inside it在给定一条线的情况下找到周围的矩形区域
【发布时间】:2018-08-15 20:53:31
【问题描述】:

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

我正在研究平面图数据集的图像分割问题。我将使用全卷积网络(FCN)来做同样的事情。

现在,FCN 需要一个图像,一个相应的分割图像。 例如:

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

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

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

问题我已经为大量此类图像添加了注释数据,但是没有以上述形式进行注释。墙壁被注释为简单的线条 --- 这意味着它们只有 1px 厚,实际上并没有填充实际图像中墙壁的区域/厚度。请参阅以下示例:

请参见上图左上角代表墙壁的 2 条线。虽然墙很厚,但我作为注释数据的只是那些粉红色的 1px 粗线。

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

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

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

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

再次对数据进行注释将非常困难且成本高昂,因此我问这个问题是否可以通过编程方式实现。

我对 opencv 和 matplotlib 知之甚少,因此这可能是一个新手问题。这可能是一件非常非常简单的事情。在这种情况下,请让我知道我需要阅读的算法或功能。

谢谢。

【问题讨论】:

  • 很抱歉,我不明白对这个问题投反对票的原因。如果你们让我知道同样的原因,那就太好了。如果有人能指出我正确的方向,我会很高兴。

标签: python opencv matplotlib annotations computer-vision


【解决方案1】:

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

相反,您需要“波前”填充:将整条线向南和向北延伸(线尺寸超过一个像素)直至全部 em> 的相邻像素是灰色的。然后对东西方向做同样的事情。您可以通过将线复制到相邻的像素行/列来执行扩展。

我不知道有哪个包会直接支持这个,但大多数会做矢量化复制粘贴或等效更改。

【讨论】:

    【解决方案2】:

    编辑我的答案以涵盖@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-half of wall width;y1'],右下角坐标是 [x2; y2'-墙宽的一半].

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

    【讨论】:

    • 谢谢。我最初也是这么想的,但这对我来说似乎并不是一种优化的方法。无论如何,即使我继续这样的事情,有没有一种很好的方法可以使用一些现有的 matplotlib 或 opencv2 函数来帮助我解决这个问题?像有没有可以直接获得粉红色像素点以及所有相邻像素点的方法?在达到特定条件之前,有什么可以继续填充邻居点的吗?
    • 为了获得粉红色像素,您可以使用 InRange 类型的函数。 docs.opencv.org/3.4/da/d97/tutorial_threshold_inRange.html。现在,要找到满足特定条件的像素,我相信迭代直到找到图像边框将是最好的方法,特别是对于我在编辑后的答案中给出的解决方案。
    • 您好,感谢您提供更新和更清晰的答案。我碰巧使用了这种方法,对于垂直线,我检查了左侧一个像素的端点是否也具有相同的背景颜色……如果是,我会在这里画一条线。然后再次向左移动 1 px。依此类推……同样,向右。然后对于水平线,我类似地迭代并继续在上方和下方绘制相邻的线。这种方法也有效。你的也可以。我接受你的回答。对于将来提及此内容的任何人,请记住,您需要将粉红色线清楚地放在墙区域内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2021-12-22
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多