Python如何将坐标转换为二值掩码 基于numpy或scikit-image实现
仅用numpy+scikit-image生成匹配plt.fill效果的二值掩码
完全不需要依赖OpenCV,直接使用scikit-image内置的多边形绘制接口即可实现,填充规则和plt.fill完全一致,输出就是仅含0/1的numpy数组。
核心实现逻辑
- 按目标尺寸初始化全0的掩码数组,注意numpy数组维度顺序为
(高度, 宽度),你需要的35×75尺寸对应shape为(35,75) - 对多边形顶点坐标做尺度映射,让坐标范围匹配掩码的像素坐标区间
- 调用
skimage.draw.polygon获取多边形覆盖的所有像素索引,将对应位置的掩码值置为1
可直接运行的示例代码
对应你提供的随机多边形测试场景,代码如下:
import numpy as np from skimage.draw import polygon # 和示例保持相同随机种子,生成一致的多边形顶点 np.random.seed(1) x = np.random.uniform(-100, 100, 4) y = np.random.uniform(-100, 100, 4) # 初始化目标尺寸的全0二值掩码 mask_h, mask_w = 35, 75 mask = np.zeros((mask_h, mask_w), dtype=np.uint8) # 坐标映射:将[-100, 100]范围的原始坐标映射到掩码像素坐标范围 # x对应掩码的宽度(列)方向,y对应掩码的高度(行)方向 x_pixel = (x + 100) / 200 * (mask_w - 1) y_pixel = (y + 100) / 200 * (mask_h - 1) # 提取多边形覆盖的像素索引,填充掩码 rr, cc = polygon(y_pixel, x_pixel, shape=(mask_h, mask_w)) mask[rr, cc] = 1
使用说明
- 最终生成的
mask就是仅包含0和1的numpy数组,用plt.imshow(mask)绘制可验证填充效果和plt.fill完全一致 - 如果你的JSON标注里的坐标本身就是像素级坐标,不需要做上述示例里的坐标映射,直接将标注的y(行方向)、x(列方向)坐标传入
polygon函数即可 - 传入
polygon的顶点顺序和传给plt.fill的顺序保持完全一致,即可保证填充效果无偏差 - 如果需要布尔类型掩码,初始化掩码时将dtype改为
bool即可
内容的提问来源于stack exchange,提问作者Petr
相关产品推荐
相关产品推荐

