Python-将二进制掩码转换为多边形

Kam*_*amu 4 python numpy mask polygon coordinates

给定一个简单的二进制掩码(例如矩形的边界)。

二进制掩码

如何使用多边形获取 xy 坐标?

这是我到目前为止所尝试过的:

coords = np.transpose(np.nonzero(mask))
Run Code Online (Sandbox Code Playgroud)

然而,这种方法会生成填充的对象,而不是所需的边界。

plt.plot(coords[:, 1], coords[:,0])
Run Code Online (Sandbox Code Playgroud)

不需要的输出

基本上,我想要白色像素的 xy 坐标列表,以使用此列表重新绘制矩形(未填充)。

小智 7

使用cv2.findContours适用于复杂形状和多个对象。Polygonslist 包含coords每个看起来像这样的列表 [x1, y1, x2, y2, x3, y3, ...]。

contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
polygons = []

for obj in contours:
    coords = []
        
    for point in obj:
        coords.append(int(point[0][0]))
        coords.append(int(point[0][1]))

    polygons.append(coords)
Run Code Online (Sandbox Code Playgroud)


nat*_*ncy 5

您可以使用np.column_stack()+ np.where()。这个想法是确定二值图像中的白色像素,然后按相应的顺序(x, y)排序

coords = np.column_stack(np.where(image > 0))
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用 OpenCV 查找边界矩形的坐标cv2.boundingRect()。这将为您提供宽度、高度和左上角(x,y)坐标。这是一个查找坐标然后将多边形绘制到空白蒙版上的示例

import cv2
import numpy as np

image = cv2.imread('1.png', 0)
x,y,w,h = cv2.boundingRect(image)
mask = np.ones(image.shape, dtype=np.uint8) * 255
mask = cv2.merge([mask,mask,mask])
cv2.rectangle(mask, (x, y), (x + w, y + h), (36,255,12), 2)

cv2.imshow('mask', mask)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)