【问题标题】:How to make mask from all contours with fillConvexPoly如何使用 fillConvexPoly 从所有轮廓制作遮罩
【发布时间】:2020-01-19 14:10:44
【问题描述】:

我正在尝试用轮廓制作面具。 Here's my full df

这里是前 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.")

这是在具有我图像形状的物体上绘制圆弧的结果。

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

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

问题

现在,我想创建一个包含所有多边形的蒙版(在本例中为左侧)。所以我创建了一个蒙版并使用 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)

【问题讨论】:

    标签: python opencv image-processing mask


    【解决方案1】:

    解决了,我真正要找的函数是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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2012-11-06
      相关资源
      最近更新 更多