合肥网站建设 卫来科技,申请网页域名,兰州移动端网站建设,网页设计公司网站【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法#xff08;框选前景#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割… 【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法框选前景 【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法掩模图像 更多内容请见 【OpenCV 例程200篇 总目录-202206更新】 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法框选前景 6. 图像分割之图割法
基于图论的图像分割技术的基本思想是将图像映射为带权的无向图把像素视为节点两个节点之间的边的权重对应于两个像素之间相似性的度量割的容量就对应于能量函数使用最大流最小割算法对图进行切割得到的最小割就对应于最优图像分割。 6.3 图割分割算法 GrabCut
GrabCut 算法是对 GraphCut 的改进使用高斯混合模型GMM对背景和目标建立模型采用迭代方法实现分割能量的最小化同时支持不完整的标记。
GrabCut 算法有效利用了图像中的纹理颜色信息和边界反差信息只需要要少量的人工交互操作就可以对目标实现较好的分割效果。
GrabCut 与 GraphCut 的区别主要是 1GraphCut 中目标和背景模型是基于灰度直方图GrabCut 中使用三通道混合高斯模型GMM 取代 2GraphCut 中直接求解能量最小化分割GrabCut 采用不断进行分割估计和模型参数学习的交互迭代过程 3GraphCut 需要用户指定目标和背景的一些种子点而 GrabCut 只要框选目标来提供背景区域的像素集即允许不完全的标注incomplete labelling。
GrabCut 的优点是 1交互简单只要在目标外面画一个框来框选目标就可以实现良好的分割效果 2如果增加用户交互指定一些属于目标的像素可以得到更好的分割效果 3Border Matting 技术使目标分割边界更加自然和完美。
GrabCut算法的工作原理是
1指定图像中包含分割目标的矩形边界框矩形框以外的区域被认为是“确定背景”。 2根据矩形框外部的“确定背景”的数据来划分矩形框区域内的前景和背景。 3用高斯混合模型Gaussians Mixture Model对前景和背景建模估计前景和背景的颜色分布。 4根据像素分布生成带有前景节点和背景节点的连通图Graph每个像素连接到前景节点或背景节点的边的权重由像素是前景或背景的概率来决定。 5图像分割问题转换为图割问题使用最大流最小割算法对图进行切割。 6重复上述过程直至达到收敛条件或迭代次数。
OpenCV 也提供了函数 cv.grabCut 实现 GrabCut 图割算法。
函数说明
cv.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount[, modeGC_EVAL]) → mask, bgdModel, fgdModel 参数说明
image输入图像8-bit/3-channel 彩色图像mask输入/输出掩模8-bit 单通道图像如边界框选则自动产生掩模图像rect包含分割对象的边框矩形格式为 (x,y,w,h)仅在 mode 为 cv2.GC_INIT_WITH_MASK 时适用bgdModel建模背景使用的临时数组形状为 (1,65) 的 np.float 数组fgdModel建模前景时使用的临时数组形状为 (1,65) 的 np.float 数组iterCount迭代次数mode操作模式 cv.GC_INIT_WITH_RECT使用边界矩形初始化状态和掩模图像运行迭代算法cv.GC_INIT_WITH_MASK使用提供的掩模图像进行状态初始化cv.GC_EVAL表示算法应该恢复cv.GC_EVAL_FREEZE_MODEL用固定模型执行一次迭代算法
OpenCV 的 GrabCut 返回一个3元组 (mask, bgdModel, fgdModel)
mask 应用GrabCut后的输出掩模bgModel 用于建模背景的临时数组(可以忽略此值)fgModel 用于建模前景的临时数组(同样你可以忽略此值)
注意事项
OpenCV 的 GrabCut 返回元组 (mask, bgdModel, fgdModel)mask 是应用 GrabCut 算法后的输出掩模。迭代次数越多GrabCut 运行的时间越长理想情况下的性能会更好。cv.GC_INIT_WITH_RECT 和 cv.GC_INIT_WITH_MASK 可以组合使用。 例程 11.35 GrabCut 图割分割算法框选前景
本例用 OpenCV 实现 GrabCut显示原始图像在图像上用鼠标设置矩形框回车确认作为目标前景的边界框。也可以直接在程序中设置边界框矩形的位置参数。 # 11.35 GrabCut 图割分割算法框选前景image cv2.imread(../images/imgGaia.tif, flags1) # 读取彩色图像(BGR)mask np.zeros(image.shape[:2], dtypeuint8)# 定义矩形框框选目标前景# rect (118, 125, 220, 245) # 直接设置矩形的位置参数也可以鼠标框选 ROIprint(Select a ROI and then press SPACE or ENTER button!\n)roi cv2.selectROI(image, showCrosshairTrue, fromCenterFalse)xmin, ymin, w, h roi # 矩形裁剪区域 (ymin:yminh, xmin:xminw) 的位置参数rect (xmin, ymin, w, h) # 边界框矩形的坐标和尺寸imgROI np.zeros_like(image) # 创建与 image 相同形状的黑色图像imgROI[ymin:ymin h, xmin:xmin w] image[ymin:ymin h, xmin:xmin w].copy()print(xmin, ymin, w, h)fgModel np.zeros((1, 65), dtypefloat) # 前景模型, 13*5bgModel np.zeros((1, 65), dtypefloat) # 背景模型, 13*5iter 5(mask, bgModel, fgModel) cv2.grabCut(image, mask, rect, bgModel, fgModel, iter,modecv2.GC_INIT_WITH_RECT) # 框选前景分割模式# 将所有确定背景和可能背景像素设置为 0而确定前景和可能前景像素设置为 1maskOutput np.where((mask cv2.GC_BGD) | (mask cv2.GC_PR_BGD), 0, 1)maskGrabCut (maskOutput * 255).astype(uint8)imgGrabCut cv2.bitwise_and(image, image, maskmaskGrabCut)plt.figure(figsize(10, 7))plt.subplot(231), plt.axis(off), plt.title(Origin image)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # 显示 img(RGB)plt.subplot(232), plt.axis(off), plt.title(Bounding box)plt.imshow(cv2.cvtColor(imgROI, cv2.COLOR_BGR2RGB)) # 显示 img(RGB)plt.subplot(233), plt.axis(off), plt.title(Mask for definite background)maskBGD (mask cv2.GC_BGD).astype(uint8) * 255plt.imshow(maskBGD, gray) # definite backgroundplt.subplot(234), plt.axis(off), plt.title(Mask for probable background)maskPBGD (mask cv2.GC_PR_BGD).astype(uint8) * 255plt.imshow(maskPBGD, gray) # probable backgroundplt.subplot(235), plt.axis(off), plt.title(GrabCut Mask)# maskGrabCut np.where((maskcv2.GC_BGD) | (maskcv2.GC_PR_BGD), 0, 1)plt.imshow(maskGrabCut, gray) # mask generated by GrabCutplt.subplot(236), plt.axis(off), plt.title(GrabCut Output)plt.imshow(cv2.cvtColor(imgGrabCut, cv2.COLOR_BGR2RGB)) # GrabCut Outputplt.tight_layout()plt.show()本节完 版权声明
OpenCV 例程200篇 总目录-202205更新 youcansxupt 原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/124744467)
Copyright 2022 youcans, XUPT Crated2022-5-12 欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列持续更新中 【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法框选前景 【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法掩模图像 更多内容请见 【OpenCV 例程200篇 总目录-202206更新】