如何在Python中将480x600图像中的矩形ROI转换为多边形ROI
如何将矩形ROI改为多边形ROI?
你当前的矩形ROI通过上下左右四个边界参数定义,要改成多边形ROI,需从参数定义、约束条件、ROI绘制逻辑三个维度调整,具体操作如下:
1. 修改ROI参数定义
矩形的四个边界无法描述多边形形态,需直接定义多边形的顶点坐标列表,每个顶点以(y, x)(对应图像的行、列,符合多数图像处理库的坐标系规则)格式表示,示例代码如下:
import numpy as np # 定义多边形顶点,按顺时针/逆时针顺序排列以保证闭合 poly_vertices = np.array([ (150, 180), (150, 400), (200, 400), (200, 250), (180, 180) ], dtype=np.int32)
2. 更新约束条件
原矩形的边界大小约束不再适用,需针对多边形特性添加校验逻辑:
# 校验顶点数量:多边形至少需要3个顶点 if len(poly_vertices) < 3: raise ValueError("多边形ROI至少需要3个顶点") # 校验顶点坐标是否在图像范围内(假设cleaned为原始图像) max_y, max_x = cleaned.shape[:2] for (y, x) in poly_vertices: if y < 0 or y >= max_y or x < 0 or x >= max_x: raise ValueError("多边形顶点坐标超出图像范围")
3. 修改ROI图像创建逻辑
原代码仅初始化了空图像,需添加多边形填充逻辑,以下提供两种实现方式:
方式一:使用OpenCV填充
import cv2 # 初始化与原始图像同尺寸、同类型的全黑图像 image = np.zeros(cleaned.shape, dtype=cleaned.dtype) # 填充多边形区域(彩色图像用(255,255,255),灰度图像用255) fill_color = (255, 255, 255) if len(cleaned.shape) == 3 else 255 cv2.fillPoly(image, [poly_vertices], color=fill_color)
方式二:使用scikit-image填充
from skimage.draw import polygon # 初始化空图像 image = np.zeros(cleaned.shape, dtype=cleaned.dtype) # 拆分顶点的y、x坐标 y_coords, x_coords = zip(*poly_vertices) # 获取多边形区域的像素索引并填充 rr, cc = polygon(y_coords, x_coords, cleaned.shape) image[rr, cc] = 255
内容的提问来源于stack exchange,提问作者user20003920
相关产品推荐
相关产品推荐

