目录
在图像分割领域,一个重要任务便是分割出感兴趣(ROI)区域。如果是简易的矩形ROI区域其实是非常容易分割的,opencv的官方python教程里也有教到最简易的矩形ROI分割(剪裁),其本质是多维数组(矩阵)的切片。但是现实情况中,ROI是不规则的多边形,也可能是曲线边界,那么该如何分割出来呢?下面总结几种思路。
可能只提供核心部分的代码示例,具体应用要结合你自己的项目来修正。
一、已知边界坐标,直接画出多边形
例:最基础的画个四边形
# 定义四个顶点坐标
pts = np.array([[10, 5], [50, 10], [70, 20], [20, 30]], np.int32)
# 顶点个数:4,矩阵变成4*1*2维
# OpenCV中需要将多边形的顶点坐标变成顶点数×1×2维的矩阵
# 这里 reshape 的第一个参数为-1, 表示“任意”,意思是这一维的值是根据后面的维度的计算出来的
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0, 255, 255))
上例中,img是你的画布原图。pts你可以随便改,改成自己的边界点。注意cv2.polylines中参数pts要加[ ]。
二、通过形态学操作产生Mask
腐蚀、膨胀之后,产生二值化(非黑即白)的mask,然后和图像做与运算。
腐蚀膨胀的操作方法简单复习一下:
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10)) # 矩形结构:MORPH_RECT
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15)) # 椭圆结构:MORPH_ELLIPSE
img = cv2.erode(img, kernel) # 腐蚀
img = cv2.dilate(img, kernel) # 膨胀