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

news2024/11/25 3:15:19
  • 操作系统: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.coloradmin.cn/o/1930347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pr 2024下载安装,Adobe Premiere pro2024剪辑软件下载合集获取

Premiere Pro 2023中文版简称Pr&#xff0c;pr2023是一款视频编辑软件。 pr 2023不仅可以帮助用户对各种视频进行剪辑、旋转、分割、合并、字幕添加、背景音乐等基础的处理&#xff0c;还能帮助用户进行视频颜色校正、颜色分级、稳定镜头、调整层、更改片段的持续时间和速度、效…

软件架构之基于中间件开发

软件架构之基于中间件开发 第 15 章&#xff1a;基于中间件的开发15.1 中间件技术15.1.1 中间件的概念15.1.2 中间件的分类 15.1.3 中间件产品介绍15.2 应用服务器技术15.2.1 应用服务器的概念15.2.2 主要的应用服务器15.3.1 表示层15.3.2 应用服务层 15.4 .NET15.4.1 .NET 平台…

LeetCode热题100刷题16:74. 搜索二维矩阵、33. 搜索旋转排序数组、153. 寻找旋转排序数组中的最小值、98. 验证二叉搜索树

74. 搜索二维矩阵 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int row matrix.size();int col matrix[0].size();for(int i0;i<row;i) {//先排除一下不存在的情况if(i>0&&matrix[i][0]>target…

自动驾驶车道线检测系列—3D-LaneNet: End-to-End 3D Multiple Lane Detection

文章目录 1. 摘要概述2. 背景介绍3. 方法3.1 俯视图投影3.2 网络结构3.2.1 投影变换层3.2.2 投影变换层3.2.3 道路投影预测分支 3.3 车道预测头3.4 训练和真实值关联 4. 实验4.1 合成 3D 车道数据集4.2 真实世界 3D 车道数据集4.3 评估结果4.4 评估图像仅车道检测 5. 总结和讨论…

技能 | postman接口测试工具安装及使用

哈喽小伙伴们大家好!今天来给大家分享一款轻量级,高效好用的接口测试工具-postman. Postman是一个流行的API开发工具&#xff0c;主要用于测试、开发和文档化API。以下是关于Postman的介绍及其主要使用场景&#xff1a; Postman介绍&#xff1a; 1. 功能丰富的API客户端&#…

【14】Github Copilot环境搭建

环境搭建 这里以Visual Studio Code为例&#xff0c;安装好vs code&#xff0c;打开扩展侧边菜单栏&#xff0c;搜索“Github Copilot”&#xff0c;会出现如下图的两个插件&#xff0c;点击安装第一个&#xff0c;另一个会附带一起安装&#xff0c;然后弹出提示重新启动vs co…

怎么调整硬盘分区?让电脑运行更加高效!

硬盘分区是电脑存储管理的重要组成部分&#xff0c;合理的分区设置不仅能提高数据管理的效率&#xff0c;还能在一定程度上提升系统的运行性能。然而&#xff0c;随着使用需求的变化&#xff0c;我们可能需要对已有的硬盘分区进行调整。那么&#xff0c;我们该怎么调整硬盘分区…

zookeeper+kafka消息队列群集部署

消息队列(Message Queue)&#xff0c;是分布式系统中重要的组件&#xff0c;其通用的使用场景可以简单地描述为:当不需要立即获得结果&#xff0c;但是并发量又需要进行控制的时候&#xff0c;差不多就是需要使用消息队列的时候。 一、消息队列 1.什么是消息队列 消息(Messag…

Windows命令行(CMD)中,tasklist | findstr(搜索并显示包含特定字符串的进程信息)

文章目录 示例注意事项示例&#xff1a;使用 /FI 选项过滤进程 在Windows命令行&#xff08;CMD&#xff09;中&#xff0c; tasklist 命令用于显示当前运行的进程列表&#xff0c;而 findstr 命令则用于搜索字符串。当你将 tasklist 命令的输出通过管道&#xff08; |&…

支持大量边缘盒子集中管理调度的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…

解读|http和https的区别,谁更好用

在日常我们浏览网页时&#xff0c;有些网站会看到www前面是http&#xff0c;有些是https&#xff0c;这两种有什么区别呢&#xff1f;为什么单单多了“s”&#xff0c;会有人说这个网页会更安全些&#xff1f; HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;…

【芯片设计- RTL 数字逻辑设计入门 9.1 -- CRG模块】

请阅读【芯片设计 RTL 数字逻辑设计扫盲 】 转自&#xff1a;芯片设计基础 – CRG模块 文章目录 CRG模块CRG时钟系统CRG复位系统同步复位同步复位的优点同步复位的缺点 异步复位异步复位的优点异步复位的缺点 异步复位同步释放 CRG模块 CRG是芯片里的时钟和复位生成模块&#…

Databend 开源周报第 153 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend。 支持必须更改密码…

npm 报错Error: EEXIST: file already exists, mkdir ‘C:\Windows\System32\cmd.exe‘

npm 报错Error: EEXIST: file already exists, mkdir C:\Windows\System32\cmd.exe 不管输npm 什么命令都报这个错&#xff1a; 报错图&#xff1a; 网上说恢复操作系统&#xff0c;最后定位为应该是配置问题&#xff0c; 我是配置问题 网上查了&#xff0c;最后定位为配置问…

【Mamba】Mamba的部署

ubuntu系统安装11.6版本的cuda 可以参考这两篇博客 ubuntu22.04多版本安装cuda及快速切换&#xff08;cuda11.1和11.8&#xff09;_ubuntu调整cuda版本 【Linux】在一台机器上同时安装多个版本的CUDA&#xff08;切换CUDA版本&#xff09;_linux安装多个cuda 安装CUDA https…

程易科技:十年匠心,与您同行

序章&#xff1a;时光的见证者 十年前&#xff0c;当第一缕曙光照亮程易科技的办公室&#xff0c;一个关于梦想、创新与陪伴的故事悄然启幕。程易科技&#xff0c;一家以自研DSP数字化服务平台为核心&#xff0c;致力于为企业提供高效、低成本业务构建能力的科技企业&#xff…

django中日志模块logging的配置和使用

一、文件的配置 settings.py文件中添加LOGGING块的配置&#xff0c;配置如下 # 日志记录 LOGGING {"version": 1,"disable_existing_loggers": False, # 用于确定在应用新的日志配置时是否禁用之前配置的日志器# 格式器"formatters": {"v…

【后端开发实习】用MongoDB和Redis实现消息队列搭建分布式邮件消息系统

用Redis实现消息队列并搭建分布式邮件消息系统 系统介绍Redis实现消息队列思路分析代码实现 MongoDB监听数据变化思路分析代码实现Mongoose测试连接监听mongodb数据变化 注意点 系统介绍 本次要实现的是一个能够实现实时监控Mongodb中数据变化的系统&#xff0c;要能够在数据发…

电机泵盖机器人打磨去毛刺,选德国进口高精度主轴

机器人打磨去毛刺该如何选择主轴呢&#xff1f;首先我们需要考虑的是工件的材质&#xff0c;电机泵盖通常使用铸铁、不锈钢、合金钢等金属材质&#xff0c;因此这类保持的硬度较高&#xff0c;一般会选择功率、扭矩较大的德国进口高精度主轴Kasite 4060 ER-S。 Kasite 4060 ER-…

持续集成03--Jenkins的安装与配置

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的实践中&#xff0c;Jenkins作为一个开源的自动化服务器&#xff0c;扮演着至关重要的角色。本篇“持续集成03--Jenkins的安装配置”将带您走进Jenkins的世界&#xff0c;深入了解如何在Linux环境中安装并配置Jenkins。…