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

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

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

如何使用多边形获取x-y坐标?

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

coords = np.transpose(np.nonzero(mask))

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

plt.plot(coords[:,1],coords[:,0])

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

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

zhangzhiwei1986913 回答:Python-将二进制掩码转换为多边形

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

coords = np.column_stack(np.where(image > 0))

另一种方法是使用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()
,

您可以使用skimage.measure.regionprops函数将正方形视为对象并使用其属性。

我强烈建议您看一下该文档,因为它在许多情况下都是非常有用的功能:

https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops

此外,还有skimage.measure.regionprops_table可以给您一个字典,可以隐蔽到熊猫数据框。

这是我的解决方法:

from skimage.io import imread
from skimage.measure import regionprops_table
from pandas import DataFrame

import numpy as np
import matplotlib.pyplot as plt

rectangle = imread('rectangle_img.png')    
props_rect = DataFrame(regionprops_table(rectangle,properties=['coords']))

new_img = np.zeros((rectangle.shape[0],rectangle.shape[1]))

for point in props_rect['coords'][0]:

    new_img[point[0],point[1]] = 1


plt.imshow(new_img)
,

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

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

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

        polygons.append(coords)
本文链接:https://www.f2er.com/3092729.html

大家都在问