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

  • 操作系统: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_RECTcv::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.mzph.cn/diannao/48518.shtml

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

相关文章

AI多模态识别ALM大模型分享:Qwen-Audio

ALM (Large Audio Language Model) 1&#xff09;Qwen-Audio 声音音频对话 参考&#xff1a; https://qwen-audio.github.io/Qwen-Audio/ https://huggingface.co/Qwen/Qwen-Audio-Chat “Qwen-Audio 接受多种音频&#xff08;人类语音、自然声音、音乐和歌曲&#xff09;以及…

基于面向对象和递归的拦截器设计模式

1 定义 拦截器模式&#xff08;Interceptor Pattern&#xff09;&#xff0c;是指提供一种通用的扩展机制&#xff0c;可以在业务操作前后提供一些切面的&#xff08;Cross-Cutting&#xff09;的操作。这些切面操作通常是和业务无关的&#xff0c;比如日志记录、性能统计、安…

day2 单机并发缓存

文章目录 1 sync.Mutex2 支持并发读写3 主体结构 Group3.1 回调 Getter3.2 Group 的定义3.3 Group 的 Get 方法 4 测试 本文代码地址&#xff1a; https://gitee.com/lymgoforIT/gee-cache/tree/master/day2-single-node 本文是7天用Go从零实现分布式缓存GeeCache的第二篇。 …

【LeetCode】80.删除有序数组中的重复项II

1. 题目 2. 分析 3. 代码 class Solution:def removeDuplicates(self, nums: List[int]) -> int:if len(nums) < 3:return len(nums)i 0j 1k 2while(k < len(nums)):if (nums[i] nums[j]):while(k < len(nums) and nums[j] nums[k] ):k1if (k < len(nums…

校验deb、rpm、apt、yum安装文件完整性测试

简介&#xff1a;deb包在Linux操作系统中类似于windows中的软件包&#xff08;msi&#xff09;&#xff0c;几乎不需要什么复杂的编译即可通过鼠标点击安装使用。此外,deb广泛应用于越狱后iOS软件及MeeGo&#xff08;含Maemo软件&#xff09;中。deb 格式是 Debian 系统(包含 D…

StringBuilder和StringBuffer

目录 &#xff08;一&#xff09;为什么要引入StringBuilder和StringBuffer &#xff08;二&#xff09;StringBuilder和StringBuffer &#xff08;1&#xff09;底层数组长度 (2)StringBuilder与StringBuffer扩容机制 &#xff08;3&#xff09;StringBuilder和StringBuf…

并发编程面试题1

并发编程 1、线程池中提交一个任务的流程是怎样的&#xff1f; 1、提交任务&#xff1a;首先&#xff0c;一个任务被提交到线程池。这个任务通常是一个实现了Runnable或Callable接口的对象&#xff1b; 2、检测线程池状态&#xff1a;线程池会首先检测其运行状态。如果线程池…

javafx使用发现的问题

1.按钮的方法 如果在fxml按钮的方法报错&#xff0c;并且你已在lei中添加了它的按钮及其按钮方法&#xff0c;那么可能是FXML和控制器类未正确关联&#xff1a; 确保你的FXML文件通过 fx:controller 属性正确指定了与之关联的控制器类。例如&#xff0c;fx:controller"c…

数据库之存储引擎

目录 一、MySQL支持的存储引擎 二、查看MySQL默认存储引擎 三、修改MySQL默认存储引擎 四、常用的存储引擎 1.InnoDB 2.MyISAM 3.MEMORY 一、MySQL支持的存储引擎 使用SHOW ENGINES \G; 命令查看 以“\G”结尾&#xff0c;其作用是将查询结果按列显示。 Engine&#xff…

更加深入Mysql-04-MySQL 多表查询与事务的操作

文章目录 多表查询内连接隐式内连接显示内连接 外连接左外连接右外连接 子查询 事务事务隔离级别 多表查询 有时我们不仅需要一个表的数据&#xff0c;数据可能关联到俩个表或者三个表&#xff0c;这时我们就要进行夺标查询了。 数据准备&#xff1a; 创建一个部门表并且插入…

Fiddler 导出请求为curl格式

来自:https://www.cnblogs.com/yudongdong/p/15418181.html Fiddler 下载地址: https://downloads.getfiddler.com/fiddler-classic/FiddlerSetup.5.0.20243.10853-latest.exe 这段代码加到类中 public static RulesOption("关闭请求体转代码", "生成代码&qu…

达梦数据库系列—29. DTS迁移ORACLE到DM

目录 1.ORACLE源端信息 2.DM目的端信息 3.DTS 迁移评估 4.数据库迁移 4.1 Oracle 源端数据库准备 4.2 目的端达梦数据库准备 初始化参数设置 兼容性参数设置 表空间规划 用户规划 创建迁移用户和表空间 4.3迁移步骤 创建迁移 配置数据源 配置迁移对象及策略 开…

django-vue-admin项目运行

文本主要对django-vue-admin项目进行了简要介绍&#xff0c;并且对前后端进行了源码安装和运行。在此基础上可作为管理系统二次开发的基础框架。 一.django-vue-admin简介和安装 1.简介 django-vue-admin项目是基于RBAC模型权限控制的中小型应用的基础开发平台&#xff0c;采…

昇思MindSpore学习总结十六 —— 基于MindSpore的GPT2文本摘要

1、mindnlp 版本要求 !pip install tokenizers0.15.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # 该案例在 mindnlp 0.3.1 版本完成适配&#xff0c;如果发现案例跑不通&#xff0c;可以指定mindnlp版本&#xff0c;执行!pip install mindnlp0.3.1 !pip install mindnlp …

使用Amazon Web Services Lambda把天气预报推送到微信

最近北京开始下雨&#xff0c;开始和同事打赌几点能够雨停&#xff0c;虽然Iphone已经提供了实时天气&#xff0c;但是还是想用国内的API试试看看是不是更加准确些。 以下是我使用的服务&#xff1a; 地图SDK/APP获取 经纬度彩云天气API 通过地理位置获取天气信息Lambda 作为…

关于Mysql的面试题(实时更新中~)

一、主键约束与“not null unique”区别 1、作为Primary Key的域/域组不能为null&#xff0c;而Unique Key可以。 2、在一个表中只能有一个Primary Key&#xff0c;而多个Unique Key可以同时存在。unique not null 可以 将表的一列或多列定义为唯一性属性&#xff0c;而prima…

buu做题(6)

目录 [GWCTF 2019]我有一个数据库 [WUSTCTF2020]朴实无华 [GWCTF 2019]我有一个数据库 什么都没有, 尝试用dirsearch扫一下目录 可以扫到一个 /phpmyadmin 可以直接进入到数据库里面 但里面没什么东西 可以看到它的版本不是最新的, 搜一下相关的漏洞 phpMyAdmin 4.8.1后台文…

go关于string与[]byte再学深一点

目标&#xff1a;充分理解string与[]bytes零拷贝转换的实现 先回顾下string与[]byte的基本知识 1. string与[]byte的数据结构 reflect包中关于字符串的数据结构 // StringHeader is the runtime representation of a string.type StringHeader struct {Data uintptrLen int} …

ClickHouse 入门(一)【基本特点、数据类型与表引擎】

前言 今天开始学习 ClickHouse &#xff0c;一种 OLAP 数据库&#xff0c;实时数仓中用到的比较多&#xff1b; 1、ClickHouse 入门 ClickHouse 是俄罗斯的 Yandex&#xff08;搜索引擎公司&#xff09;在 2016 年开源的列式存储数据库&#xff08;HBase 也是列式存储&#xf…

某宝同款度盘不限速后台系统源码

简介&#xff1a; 某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp…