OpenCV中的GrabCut图像分割算法的使用

news/2024/8/26 15:21:29 标签: opencv, 算法, 人工智能
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

功能描述

      GrabCut 算法是一种用于图像分割的技术,由 Carsten Rother、Vladimir Kolmogorov 和 Andrew Blake 在 2004 年 SIGGRAPH 会议的论文《GrabCut: 交互式前景提取使用迭代图割》中提出。

      GrabCut 的主要概念是提供一个交互式的工具,让用户能够轻松地从图像中提取前景对象。用户只需标记图像的某些区域为确定的前景、确定的背景或不确定区域,算法会迭代地细化这些边界,使用图割方法求解全局优化问题,找到最佳的分割方案。

以下是 GrabCut 算法的基本工作流程:

  • 初始化:用户通过简单的画笔工具标记图像的部分区域为确定的前景、确定的背景和不确定区域。
  • 图构建:构建一个图,其中节点代表像素,边连接相邻像素。边的权重基于颜色相似性和空间邻近性。
  • 迭代优化:
    • 软分割:初始阶段,每个像素被赋予属于前景或背景的概率。
    • 图割:应用图割技术来细化分割,通过迭代优化过程调整前景和背景的概率。
    • 贝叶斯分类:使用贝叶斯分类器来更新像素的概率分布,考虑颜色模型和邻域信息。
    • 迭代终止:当分割结果收敛或达到预设的迭代次数时,算法停止。

        最终,GrabCut 能够生成高质量的图像分割,即使是在前景和背景之间有复杂边缘或相似颜色的情况下也能很好地工作。该算法广泛应用于图像编辑软件中,如 Adobe Photoshop,为用户提供了一个快速而有效的工具来分离图像的前景部分。

函数grabCut()

OpenCV中的函数grabCut()实现了GrabCut 算法

函数原型

void cv::grabCut	
(
	InputArray 	img,
	InputOutputArray 	mask,
	Rect 	rect,
	InputOutputArray 	bgdModel,
	InputOutputArray 	fgdModel,
	int 	iterCount,
	int 	mode = GC_EVAL 
)		

参数

  • 参数img 输入的8位、3通道彩色图像.
  • 参数mask 这是一个输入/输出的8位单通道掩码图像, 在函数调用开始时,如果模式设置为GC_INIT_WITH_RECT,这个掩码会被初始化。掩码的元素可以是GrabCut算法定义的几种类型之一,分别代表不同的分割状态:确定的背景 (cv::GC_BGD)、确定的前景 (cv::GC_FGD)、可能的背景 (cv::GC_PR_BGD) 和可能的前景 (cv::GC_PR_FGD)。
  • 参数rect 这是一个ROI(Region Of Interest,感兴趣区域)矩形,它包含了你想要分割的对象。在GC_INIT_WITH_RECT模式下,这个矩形以外的像素将被标记为“明显的背景”。如果使用此模式,你需要提供一个矩形来粗略地包围目标物体。
  • 参数bgdModel 临时数组,用于背景模型,在处理同一张图像时,你不应该修改这些数组。
  • 参数fgdModel 临时数组,用于前景模型,在处理同一张图像时,你不应该修改这些数组
    iterCount : 这是你希望算法执行的迭代次数。更多的迭代通常意味着更准确的分割结果,但也会增加计算时间。注意,你可以在后续的调用中使用GC_INIT_WITH_MASK或GC_EVAL模式来进一步细化结果。
  • 参数mode 这是操作模式,可以是GrabCut算法定义的几种模式之一,包括:
    • GC_INIT_WITH_RECT: 使用矩形初始化掩码。
    • GC_INIT_WITH_MASK: 使用掩码初始化。
    • GC_EVAL: 评估模式,用于在没有改变掩码的情况下评估分割质量。
    • GC_EVAL_FREEZE_MODEL: 类似于GC_EVAL,但在这种模式下,模型不会被更新。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>

int main( int argc, char** argv )
{
    // 加载图像
    cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/fruit_small.jpg", cv::IMREAD_COLOR );

    if ( !img.data )
    {
        std::cout << "Could not open or find the image" << std::endl;
        return -1;
    }

    cv::Mat src = img.clone();

    // 创建掩码,与图像同样大小,初始化为GC_INIT_WITH_RECT
    cv::Mat mask( img.size(), CV_8UC1, cv::Scalar::all( 0 ) );
    // cv::Rect rect( 267, 463, 200, 250 );  // 前景的初始矩形区域
    cv::Rect rect( 105, 52, 270, 470 );  // 前景的初始矩形区域
    mask( rect ) = cv::GC_PR_FGD;        // 可能的前景区域

    // 创建临时矩阵,用于存储分割过程中的中间结果
    cv::Mat bgdModel, fgdModel;

    // 执行GrabCut算法
    cv::grabCut( img, mask, rect, bgdModel, fgdModel, 5, cv::GC_INIT_WITH_MASK );

    // 将掩码转换为只包含前景和背景的二值图像
    mask = ( mask == cv::GC_FGD ) + ( mask == cv::GC_PR_FGD );

    // 使用掩码显示分割后的前景
    img.setTo( cv::Scalar(), mask == 0 );

    cv::namedWindow( "original image", cv::WINDOW_NORMAL );
    cv::imshow( "original image", src );

    // 显示结果
    cv::namedWindow( "GrabCut Result", cv::WINDOW_NORMAL );
    cv::imshow( "GrabCut Result", img );
    cv::waitKey( 0 );

    return 0;
}

运行结果:

在这里插入图片描述


http://www.niftyadmin.cn/n/5558267.html

相关文章

图论建模技巧搜集

一些经典题目 找可达路径 UVa - 11604 General Sultan 平面图最小割对偶图最短路 UVa - 1376 Animal Run 最小割建模 UVa - 1515 Pool construction 费用流建模 洛谷P3159 [CQOI2012] 交换棋子 其他人写的博客 最详细&#xff08;也可能现在不是了&#xff09;网络流建模…

昇思25天学习打卡营第12天|Vision Transformer图像分类、SSD目标检测

Vision Transformer&#xff08;ViT&#xff09;简介 近些年&#xff0c;随着基于自注意&#xff08;Self-Attention&#xff09;结构的模型的发展&#xff0c;特别是Transformer模型的提出&#xff0c;极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩…

Hbase、hive以及ClickHouse的区别?

HBase、Hive以及ClickHouse是三种在大数据领域广泛使用的数据库系统&#xff0c;它们各自具有独特的特点和适用场景。以下是它们之间的主要区别&#xff1a; 一、数据模型与存储方式 系统数据模型存储方式HBase分布式、面向列的NoSQL数据库基于Hadoop的HDFS平台&#xff0c;数…

git 代理错误拒绝连接

git 克隆项目拒绝连接 现象 Failed to connect to 127.0.0.1 port 15732: 拒绝连接 问题描述 代理错误解决方法 取消代理 git config --global --unset http.proxy

【学习css3】使用flex和grid实现等高元素布局

过往的实现方法是使用浮动加计算布局来实现&#xff0c;当flex和grid问世时&#xff0c;这一切将变得简单起来 一、简单的两列实现 1、先看页面效果 2、css代码 .container {padding: 10px;width: 100ch;margin: 0 auto;box-shadow: inset 0 0 0 2px #ccc;}.column {margin: 2…

时间域ADC介绍

时间域ADC&#xff08;Time-Domain Analog-to-Digital Converter&#xff09;是一种基于时间量化原理的模数转换器&#xff0c;常用于将模拟信号转换为数字信号。与传统的逐次逼近式ADC&#xff08;Successive Approximation ADC&#xff09;或Σ-Δ ADC&#xff08;Sigma-Delt…

DAMA学习笔记(六)-数据安全

1.引言 数据安全包括安全策略和过程的规划、建立与执行&#xff0c;为数据和信息资产提供正确的身份验证、授权、访问和审计。数据安全实践的目标是根据隐私和保密法规、合同协议和业务要求来保护信息资产。这些要求来自以下几个方面: 1&#xff09;利益相关方: 应识别利益相关…

opencv—常用函数学习_“干货“_4

目录 十二、图像平滑滤波 均值滤波 (blur) 方框滤波 (boxFilter) 中值滤波 (medianBlur) 高斯滤波 (GaussianBlur) 双边滤波 (bilateralFilter) 自定义滤波器 (filter2D) 边缘保留滤波 (edgePreservingFilter) 快速非局部均值去噪 (fastNlMeansDenoising) 彩色图像的快…