tools / utils /json /mask.py
Adinosaur's picture
Upload folder using huggingface_hub
1c980b1 verified
import numpy as np
import cv2
from matplotlib import pyplot as plt
def visualize_mask(points, size, save_path="mask.png"):
"""
输入:
points : 多边形坐标 [[x1,y1], [x2,y2], ...]
size : 图像尺寸 [height, width]
save_path : 输出图片保存路径(默认当前目录mask.png)
输出:
展示并保存包含多边形顶点(红色)和掩码区域(半透明绿)的图片
"""
# 数值有效性检查
assert len(size) == 2, "size must be [height, width]"
height, width = size
assert height > 0 and width > 0, "invalid image size"
# 1. 创建彩色画布(RGBA格式,支持半透明叠加)
canvas = np.zeros((height, width, 4), dtype=np.uint8)
# 2. 预处理坐标点
polygon = []
for x, y in points:
# 将点限制在图像范围内(防止越界)
x = int(np.clip(round(x), 0, width-1))
y = int(np.clip(round(y), 0, height-1))
polygon.append([x, y])
polygon = np.array([polygon], dtype=np.int32) # OpenCV要求形状为[N,1,2]
# 3. 生成掩码区域(绿色半透明填充)
mask = np.zeros((height, width), dtype=np.uint8)
cv2.fillPoly(mask, polygon, color=1)
canvas[..., 1] = 80 * mask # 绿色通道
canvas[..., 3] = 200 * mask # 透明度通道(掩码区域半透明)
# 4. 绘制多边形顶点(红色圆点标记)
for idx, (x, y) in enumerate(polygon[0]):
color = (0, 0, 255, 255) # 纯红色(RGBA)
cv2.circle(canvas, (x, y), radius=5, color=color, thickness=-1)
cv2.putText(canvas, str(idx+1), (x+7, y+3),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255,255), 1)
# 5. 绘制多边形边界线(蓝色)
cv2.polylines(canvas, polygon, isClosed=True,
color=(255, 0, 0, 255), thickness=2) # 蓝色边界
# 6. 保存和显示结果
cv2.imwrite(save_path, canvas)
# 使用matplotlib显示(确保透明天正确处理)
plt.figure(figsize=(10, 6))
plt.title(f"Mask Visualization (Saved to {save_path})")
plt.imshow(cv2.cvtColor(canvas, cv2.COLOR_BGRA2RGBA))
plt.axis('off')
plt.show()
# ------------ 使用示例 ------------
if __name__ == "__main__":
# 你的输入数据
points = [
[602.245, 290.396],
[585.264, 289.452],
[568.283, 301.716],
[557.905, 309.264],
[546.584, 324.358],
[543.754, 342.283],
[544.698, 365.867],
[552.245, 381.905],
[571.113, 398.886],
[583.377, 407.377],
[597.528, 409.264],
[607.905, 398.886],
[626.773, 387.566],
[636.208, 384.735],
[646.584, 381.905],
[660.735, 370.584],
[661.679, 335.679],
[654.132, 313.037],
[639.981, 302.660],
[618.283, 293.226]
]
size = [960, 1280] # 高度=488,宽度=640
# 生成可视化图像
visualize_mask(
points=points,
size=size,
save_path="custom_mask_visualization.png"
)