【问题标题】:Numpy: Selecting abritrary shapes based on shape cornersNumpy:根据形状角选择任意形状
【发布时间】:2020-02-06 15:14:03
【问题描述】:

我使用 numpy 索引已经有一段时间了。但我只需要选择基本形状,例如rectanglesdiscs

但是,我现在需要能够选择更多任意形状,但我找不到这样做的好方法。理想情况下,我希望能够给出一个角列表,并为这些角中包含的所有索引进行选择。我们可以假设给定的形状是凸的

例如,给定一个填充了形状为 (10, 10) 的零的数组,通过尝试设置角 ((2,2)、(6,3)、(4,8) 和 (7) 内的值,9)) 到 1 这将返回这样的掩码

  [[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 1., 1., 1., 0., 0., 0., 0., 0.],
   [0., 0., 1., 1., 1., 1., 0., 0., 0., 0.],
   [0., 0., 1., 1., 1., 1., 1., 1., 1., 0.],
   [0., 0., 0., 1., 1., 1., 1., 1., 1., 0.],
   [0., 0., 0., 1., 1., 1., 1., 1., 1., 1.],
   [0., 0., 0., 0., 0., 0., 1., 1., 1., 1.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]

现在的问题之一是这个问题通常没有唯一的解决方案,但对我来说,采取一个合理的解决方案就足够了。但是,我想不出使用 numpy 的方法,因为似乎只支持基本的切片和清晰的数学方程。

有没有人遇到过这样的挑战?我必须求助于更传统的 python for 循环吗?

【问题讨论】:

    标签: python python-3.x numpy


    【解决方案1】:

    诚然是一个丑陋的解决方案,但是如何通过 OpenCV 从多边形中生成一个二进制掩码并使用该掩码?

    import cv2
    import numpy as np
    
    corners = np.asarray([(2,2), (6,3), (4,8), (7,9)])
    
    target = np.zeros([10,10])
    mask = cv2.fillPoly(np.zeros_like(target, dtype=np.uint8), [corners], 255).astype(bool)
    
    target[mask] = 1
    

    生成:

    >>> target
    array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 1., 1., 1., 0., 0., 0., 0., 0.],
           [0., 0., 0., 1., 1., 1., 1., 0., 0., 0.],
           [0., 0., 0., 1., 1., 1., 1., 0., 0., 0.],
           [0., 0., 0., 0., 1., 1., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
           [0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],
           [0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 1., 1., 0., 0.]], dtype=float32)
    

    注意:我按照您给它们的顺序使用角。对于 OpenCV,多边形中的点是按顺序解释的(因此我的输出和你的输出之间的形状不同)。相应地重新排序角以获得您需要的形状(例如,顺时针)。

    注意 (2):我将您的角解释为 (x, y),而不是 (row,col),因为它没有在问题中指定并且 OpenCV 使用 (x ,y) 点的约定(而 numpy 使用 (row,col))。


    要生成您想要的输出,请交换角的坐标并重新排列它们,如下所示:

    corners = np.asarray([(2,2), (6,3), (7,9), (4,8) ])[:,(1,0)]
    

    有了这个(和上面的代码)你得到:

    >>> target
    array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 1., 1., 0., 0., 0., 0., 0., 0.],
           [0., 0., 1., 1., 1., 1., 1., 0., 0., 0.],
           [0., 0., 1., 1., 1., 1., 1., 1., 1., 0.],
           [0., 0., 0., 1., 1., 1., 1., 1., 1., 0.],
           [0., 0., 0., 1., 1., 1., 1., 1., 1., 1.],
           [0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)
    

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      相关资源
      最近更新 更多