Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy:基于形状角点选择辅助形状_Python_Python 3.x_Numpy - Fatal编程技术网

Python Numpy:基于形状角点选择辅助形状

Python Numpy:基于形状角点选择辅助形状,python,python-3.x,numpy,Python,Python 3.x,Numpy,我使用numpy索引已经有一段时间了。但我只需要选择基本的形状,如或 然而,我现在需要能够选择更多的任意形状,我找不到一个好方法来做到这一点。理想情况下,我希望能够给出一个角落列表,并选择这些角落中包含的所有索引。我们可以假设给定的形状是凸的 例如,给定一个填充了形状为(10,10)的零的数组,通过尝试将角点((2,2)、(6,3)、(4,8)和(7,9))内的值设置为1,这将返回类似的掩码 [[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0.,

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

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

例如,给定一个填充了形状为(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进行循环吗?

无可否认,这是一个丑陋的解决方案,但是如何通过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),而不是(行,列),因为在问题中没有指定,OpenCV对点使用(x,y)约定(而numpy使用(行,列))


要生成所需的输出,请交换角点的坐标并按如下方式重新排列它们:

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)