使用多边形坐标创建图像掩码时位置与尺寸异常问题排查
掩码位置偏移及尺寸异常的排查与修复
核心问题分析
你遇到的掩码位置错误、尺寸偏小,主要是坐标系统不匹配和坐标超出图像范围导致的,结合skimage.draw.polygon2mask的特性,具体原因有以下几点:
1. 坐标维度顺序不匹配
polygon2mask的参数规则是:
image_shape要求传入(行数, 列数),对应图像的(高度, 宽度),你的(1920,1080)是正确的。- 多边形坐标的每个点必须是
(列坐标, 行坐标),也就是(x, y),其中x的有效范围是0~1079,y的有效范围是0~1919。
如果你的外部软件输出的坐标是 (y, x) 顺序(比如先高度后宽度),直接传入就会导致坐标错位,掩码跑到底部。
2. 坐标系y轴方向相反
多数图像编辑软件的坐标系是左上角为原点,y轴向下,但部分工具可能采用左下角为原点,y轴向上的规则。这种情况下,y坐标会完全反转,原本中心的区域会被映射到图像底部。
3. 坐标超出图像范围
你给出的第一个坐标1080.15已经超出了图像列数的最大值1079(像素索引从0开始),超出部分会被截断,直接导致掩码尺寸偏小。
修复方案与修正代码
针对上述问题,按以下步骤修正:
步骤1:统一坐标顺序
如果外部软件输出的是(y, x),先交换每个点的坐标顺序:
# 将[y, x]转换为[x, y] swapped_coords = [(x, y) for y, x in coordinates]
步骤2:反转y轴坐标(若坐标系方向相反)
将外部软件的y坐标转换为skimage兼容的y轴方向:
image_height = 1920 corrected_coords = [(x, image_height - y) for x, y in swapped_coords]
步骤3:裁剪超出范围的坐标
把所有坐标限制在图像有效范围内:
image_width = 1080 clipped_coords = [ (max(0, min(x, image_width - 1)), max(0, min(y, image_height - 1))) for x, y in corrected_coords ]
完整修正代码
import numpy as np import matplotlib.pyplot as plt from skimage.draw import polygon2mask import numpy.ma as ma # 补充缺失的ma模块导入 # 图像尺寸(行数,列数) image_shape = (1920, 1080) coordinates = ([1080.15, 400.122], [1011.45, 400.90], .......) # 你的27个原始坐标点 # 坐标修正流程 swapped_coords = [(x, y) for y, x in coordinates] # 交换坐标顺序(按需调整) corrected_coords = [(x, image_shape[0] - y) for x, y in swapped_coords] # 反转y轴(按需调整) clipped_coords = [(max(0, min(x, image_shape[1]-1)), max(0, min(y, image_shape[0]-1))) for x, y in corrected_coords] # 生成掩码与结果 polygon = np.array(clipped_coords) mask = polygon2mask(image_shape, polygon) result = ma.masked_array(image, np.invert(mask)) plt.imshow(result, cmap='gray') plt.show()
注意:如果你的外部软件坐标顺序本来就是
(x,y),可以跳过swapped_coords这一步;如果坐标系y轴方向和skimage一致,跳过corrected_coords步骤,按需调整即可。
内容的提问来源于stack exchange,提问作者FNM
相关产品推荐
相关产品推荐

