如何使用fillconverxpoly从所有轮廓制作遮罩

2024-05-19 13:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用轮廓做个面具。 Here's my full ^{}

以下是前7排

>>> df
      contour.ID        xrT        yrT        xlT        ylT
1057          20  6259.2300  4620.7845  5670.1260  4651.4670
1058          20  6253.0935  4620.7845  5682.3990  4651.4670
1059          20  6253.0935  4633.0575  5694.6720  4657.6035
1060          20  6240.8205  4633.0575  5694.6720  4657.6035
1061          20  6228.5475  4645.3305  5700.8085  4669.8765
1062          20  6228.5475  4645.3305  5700.8085  4669.8765
1063          20  6216.2745  4645.3305  5713.0815  4669.8765

我可以用一个函数画出我关心的所有轮廓

def display_all_contours(img, df, grouping_var):
    # display with matplotlib

    # Create figure and axes
    fig, ax = plt.subplots(1)

    # Display the image
    ax.imshow(img)

    # split by contour
    grouped_frame = df.groupby(grouping_var)
    li = [grouped_frame.get_group(x) for x in grouped_frame.groups]

    # for every contour
    for i in range(len(li)):
        poly = patches.Polygon(np.array([li[i].xrT, li[i].yrT]).T,
                               fill=False)
        ax.add_patch(poly)

    for i in range(len(li)):
        poly = patches.Polygon(np.array([li[i].xlT, li[i].ylT]).T,
                               fill=False, color="white")
        ax.add_patch(poly)

    return("Displaying " + str(len(np.unique(df[grouping_var]))) + " contours.")

这是在有我图像形状的东西上画contorus的结果

mask = np.zeros((9373, 12273), dtype=np.uint8)

display_all_contours(mask, df, "contour.ID")

enter image description here

问题

现在,我想创建一个所有多边形的遮罩(在这里是左侧)。因此,我创建了一个遮罩,并使用cv2.fillConvexPoly将每个多边形烧成它

mask = np.zeros((9373, 12273), dtype=np.uint8)

display_all_contours(mask, df, "contour.ID")

for poly in np.unique(df["contour.ID"]):
    # subset
    sub_df = df[df["contour.ID"] == poly]
    # burn into the mask
    # explicitly burn into the mask
    mask = cv2.fillConvexPoly(mask, np.array(sub_df[["xlT", "ylT"]], 'int32'), 1)

不知为什么我不明白,这并没有产生我想要的结果

plt.imshow(mask)

enter image description here


Tags: iniddffordisplaynpmaskli
1条回答
网友
1楼 · 发布于 2024-05-19 13:25:54

解决了这个问题,我实际上要找的函数是fillPoly

更换此线路可解决问题

# mind the np.array(..., "int32") is wrapped in [] because that's how fillPoly likes it
mask = cv2.fillPoly(mask, [np.array(sub_df[["xlT", "ylT"]], 'int32')], 1)

相关问题 更多 >