美文网首页
179.图像分割之 GrabCut 图割法(掩模图像)

179.图像分割之 GrabCut 图割法(掩模图像)

作者: 大龙10 | 来源:发表于2025-11-16 06:24 被阅读0次

10. 轮廓与图像分割索引

  • 图像分割之图割法

一、图像分割之 图割法

  • 基于图论的图像分割技术的基本思想是:将图像映射为带权的无向图,把像素视为节点,两个节点之间的边的权重对应于两个像素之间相似性的度量,割的容量就对应于能量函数;使用最大流最小割算法对图进行切割,得到的最小割就对应于最优图像分割。

二、图割分割算法 GrabCut

  • GrabCut 算法是对 GraphCut 的改进,使用高斯混合模型(GMM)对背景和目标建立模型,采用迭代方法实现分割能量的最小化,同时支持不完整的标记。

  • GrabCut 算法有效利用了图像中的纹理(颜色)信息和边界(反差)信息,只需要要少量的人工交互操作就可以对目标实现较好的分割效果。

三、函数

  • OpenCV 也提供了函数 cv.grabCut 实现 GrabCut 图割算法。

cv.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount[, mode=GC_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.36: GrabCut 图割分割算法(掩模图像)
    例程11.34 通过手动设置边界框对 GrabCut 算法进行初始化,我们也可以使用掩模图像进行初始化。掩模图像提供了图像中物体的近似分割,GrabCut 算法可以迭代地应用图割对分割结果进行改进,从图像中提取前景。
    如何生成掩模图像与 GrabCut 算法无关,掩模图像也并不需要很精确。掩模图像可以通过 Photoshop 等编辑软件手动创建,也可以应用阈值分割、边缘检测、轮廓滤波等方法获取,还可以利用深度学习方法获得。
# Copyright 2022 Youcans, XUPT
# Crated:2021-12-27

    # 11.36 GrabCut 图割分割算法(掩模图像)
    image = cv2.imread("../images/imgDeer.png", flags=1)  # 读取彩色图像(BGR)
    maskImg = cv2.imread("../images/imgDeerMask.png", flags=0)  # 读取掩模图像(xupt)

    # 生成掩模图像 mask,大于 0 的像素设为可能前景
    mask = np.zeros(image.shape[:2], dtype="uint8")
    mask[maskImg > 0] = cv2.GC_PR_FGD
    mask[maskImg == 0] = cv2.GC_BGD
    # print(mask.shape, maskInv.shape)
    # apply GrabCut using the the mask segmentation method
    fgModel = np.zeros((1, 65), dtype="float")  # 前景模型, 13*5
    bgModel = np.zeros((1, 65), dtype="float")  # 背景模型, 13*5
    iter = 5
    (mask, bgModel, fgModel) = cv2.grabCut(image, mask, None, bgModel, fgModel, iter,
                                           mode=cv2.GC_INIT_WITH_MASK)  # 基于掩模图像初始化

    # 将所有确定背景和可能背景像素设置为 0,而确定前景和可能前景像素设置为 1
    maskOutput = np.where((mask == cv2.GC_BGD) | (mask == cv2.GC_PR_BGD), 0, 1)
    maskGrabCut = 255 - (maskOutput * 255).astype("uint8")
    imgGrabCut = cv2.bitwise_and(image, image, mask=maskGrabCut)

    plt.figure(figsize=(10, 6))
    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("Mask image")
    plt.imshow(maskImg, 'gray')  # definite background
    plt.subplot(233), plt.axis('off'), plt.title("GrabCut mask")
    plt.imshow(mask, 'gray')
    plt.subplot(234), plt.axis('off'), plt.title("Mask for definite background")
    maskBGD = (mask == cv2.GC_BGD).astype("uint8") * 255
    plt.imshow(maskBGD, 'gray')  # definite background
    plt.subplot(235), plt.axis('off'), plt.title("Mask for probable background")
    maskPBGD = (mask == cv2.GC_PR_BGD).astype("uint8") * 255
    plt.imshow(maskPBGD, 'gray')  # probable background
    # plt.subplot(235), plt.axis('off'), plt.title("GrabCut Mask")
    # plt.imshow(maskGrabCut, 'gray')  # mask generated by GrabCut
    plt.subplot(236), plt.axis('off'), plt.title("Youcans Output")
    plt.imshow(cv2.cvtColor(imgGrabCut, cv2.COLOR_BGR2RGB))  # GrabCut Output
    plt.tight_layout()
    plt.show()

五、资料

youcans_的博客:
https://blog.csdn.net/youcans/article/details/124744517

相关文章

  • grabcut算法

    本文转自《图像分割之(三)从 Graph Cut 到 Grab Cut》 GrabCut是Graph Cut的改进...

  • 基于遗传算法和大津阈值分割法实现的图像分割

    一、简述 本实验采用遗传算法和大津阈值分割法确定图像分割的最佳阈值,从而对图像进行二值化分割。 二、大津阈值分割法...

  • 感兴趣目标及对象提取

    1、作用感兴趣目标提取去除冗余数据获取高分辨遥感目标对象 图像分割 二值图像 预处理 去做掩模处理 对象提取(贴标...

  • 第 3 章 处理图像的颜色

    本章包括以下内容: 用策略设计模式比较颜色; 用GrabCut 算法分割图像; 转换颜色表示法; 用色调、饱和度和...

  • Grabcut图像切割

    mouseClick (int event, int x, int y, int flags, void* par...

  • graph cut算法

    注:本文内容主要参考图像分割之(二)Graph Cut(图割)和Graph Cuts 图分割学习 Graph cu...

  • 医学图像处理

    一、图像分割 图像分割是前期的工作重点,主要使用了现成的软件来完成图像分割任务:3DMed(中国科学院自动化医学图...

  • 图像分割方法

    主流医学图像分割方法:[1] 基于图论的分割方法中心思想:将图像映射为一张无向图(带权的无向图),图像中的像素点相...

  • 图像分割

    图像分割 什么是图像分割? 图像分割就是预测图像中每一个像素所属的类别或者物体。图像分割有两个子问题,一个是只预测...

  • 转《传统图像分割算法概述》

    本文转自图像分割之(一)概述 所谓图像分割指的是根据灰度、颜色、纹理和形状等特征把图像划分成若干互不交迭的区域,并...

网友评论

      本文标题:179.图像分割之 GrabCut 图割法(掩模图像)

      本文链接:https://www.haomeiwen.com/subject/acvbfstx.html