You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.16 16:15:41