Python 在numpy数组中生成填充多边形

Python 在numpy数组中生成填充多边形,python,arrays,numpy,polygon,Python,Arrays,Numpy,Polygon,我正在寻找一种基于一组多边形顶点将填充多边形“绘制”到numpy数组中的方法。我宁愿使用尽可能少的外部库 例如:我有一个20x20 numpy数组,我希望由点(3,12)、(8,18)、(13,14)、(11,6)和(4,6)包围的区域填充1.0,而数组的其余部分包含0.0以下解决方案只需要numpy。它适用于凸多边形的顶点(在[行,列]坐标系中按顺时针顺序定义)。凹多边形可以工作,但最终会切断突出点 import numpy as np def check(p1, p2, base_arra

我正在寻找一种基于一组多边形顶点将填充多边形“绘制”到numpy数组中的方法。我宁愿使用尽可能少的外部库


例如:我有一个20x20 numpy数组,我希望由点(3,12)、(8,18)、(13,14)、(11,6)和(4,6)包围的区域填充1.0,而数组的其余部分包含0.0

以下解决方案只需要numpy。它适用于凸多边形的顶点(在[行,列]坐标系中按顺时针顺序定义)。凹多边形可以工作,但最终会切断突出点

import numpy as np

def check(p1, p2, base_array):
    """
    Uses the line defined by p1 and p2 to check array of 
    input indices against interpolated value

    Returns boolean array, with True inside and False outside of shape
    """
    idxs = np.indices(base_array.shape) # Create 3D array of indices

    p1 = p1.astype(float)
    p2 = p2.astype(float)

    # Calculate max column idx for each row idx based on interpolated line between two points
    max_col_idx = (idxs[0] - p1[0]) / (p2[0] - p1[0]) * (p2[1] - p1[1]) +  p1[1]    
    sign = np.sign(p2[0] - p1[0])
    return idxs[1] * sign <= max_col_idx * sign

def create_polygon(shape, vertices):
    """
    Creates np.array with dimensions defined by shape
    Fills polygon defined by vertices with ones, all other values zero"""
    base_array = np.zeros(shape, dtype=float)  # Initialize your array of zeros

    fill = np.ones(base_array.shape) * True  # Initialize boolean array defining shape fill

    # Create check array for each edge segment, combine into fill array
    for k in range(vertices.shape[0]):
        fill = np.all([fill, check(vertices[k-1], vertices[k], base_array)], axis=0)

    # Set all values inside polygon to one
    base_array[fill] = 1

    return base_array


# (Row, Col) Vertices of Polygon (Defined Clockwise)
vertices = np.array([
    [5,12],
    [8,18],
    [13,14],
    [11,6],
    [4,6],
])

polygon_array = create_polygon([20,20], vertices)

# This section prints numbers at each vertex for visual check, just comment out 
# to print an array of only zeros and ones
for n, vertex in enumerate(vertices):
    polygon_array[vertex[0],vertex[1]] = 10*(n+1)

# Simple routine to print the final array
for row in polygon_array.tolist():
    for c in row:
        print '{:4.1f}'.format(c),
    print ''
将numpy导入为np
def检查(p1、p2、基本阵列):
"""
使用p1和p2定义的行检查
针对插值的输入索引
返回布尔数组,形状内部为True,外部为False
"""
idxs=np.index(base_array.shape)#创建三维索引数组
p1=p1.aType(浮动)
p2=p2.aType(浮点型)
#基于两点之间的插值线计算每行idx的最大列idx
max_col_idx=(idxs[0]-p1[0])/(p2[0]-p1[0])*(p2[1]-p1[1])+p1[1]
符号=np.符号(p2[0]-p1[0])

return idxs[1]*sign我在@schoolie response和stackoverflow中发现了一个错误,不允许在注释中添加多行代码片段问题是当
p1[0]==p2[0]
时。我建议更新函数
检查

if p1[0] == p2[0]:
    max_col_idx = (idxs[0] - p1[0]) * idxs.shape[1]
    sign = np.sign(p2[1] - p1[1])
else:
    max_col_idx = (idxs[0] - p1[0]) / (p2[0] - p1[0]) * (p2[1] - p1[1]) + p1[1]
    sign = np.sign(p2[0] - p1[0])

Simon,看看这是否与你的问题重复(考虑到答案允许任意多边形):@Will-实际上根本不是绘图或GUI。只是用1和0填充数组。(特别是我生成
掩码的部分)看一看。哦,谢谢!我一直在与cv2多边形斗争,这个解决方案甚至更快!@我试过了,但对我无效。创建多边形中的填充数组全部为false。但是我检查check函数的返回值。这并不总是错误的,谢谢你,但是在
check()
函数中,这具体到哪里去了?介于
计算最大列idx..
注释和
返回…