如何使用 fillConvexPoly 从所有轮廓制作蒙版
How to make mask from all contours with fillConvexPoly
我正在尝试根据轮廓制作面具。
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)
解决了,其实我要找的功能是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)
我正在尝试根据轮廓制作面具。
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)
解决了,其实我要找的功能是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)