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…

Docker安装ELK(简易版)

1、下载ELK镜像&#xff1a;打开终端&#xff0c;并执行以下命令以下载Elasticsearch、Logstash和Kibana的Docker镜像。您也可以根据需要选择其他版本&#xff1a; docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.6 docker pull docker.elastic.co/logstash…

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; 创建一个部门表并且插入…

JVM的 6 种垃圾回收算法

JVM的垃圾回收&#xff08;Garbage Collection, GC&#xff09;算法&#xff0c;在面试八股文时偶尔会被问到&#xff0c;了解一些常见的垃圾回收算法有利于面试时吊打面试官。 以下是JVM常见的几种垃圾回收算法的介绍&#xff1a; 1. 标记-清除算法&#xff08;Mark-Sweep&a…

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 …

计算机视觉篇5 图像的位置--边框

计算机视觉篇4 图像的位置--边框 在训练集中&#xff0c;我们将每个锚框视为一个训练样本。 为了训练目标检测模型&#xff0c;我们需要每个锚框的类别&#xff08;class&#xff09;和偏移量&#xff08;offset&#xff09;标签&#xff0c;其中前者是与锚框相关的对象的类别…

Python网络编程:socket模块的入门与实践

Socket模块的基本概念 创建Socket 在Python中&#xff0c;可以使用socket模块创建Socket对象&#xff1a; import socket# 创建一个TCP/IP socket s socket.socket(socket.AF_INET, socket.SOCK_STREAM) 地址族与Socket类型 socket.AF_INET&#xff1a;IPv4地址族 socket…

#systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生

仿真调度系列文章,已经编写10篇,写到这里,相比大家都已经对VCS仿真工具的运行机制,有了大体了解。学无止境,而且真正的仿真调度行为控制,是每个EDA厂商自己产品的高度机密。言外之意,我们要抱着谦虚的态度说:我们只是懂了一点点。 一 RTL仿真中的竞争现象 在实际仿真…

【信号分解】基于极点对称模态分解ESMD实现信号分解附Matlab代码

% 导入信号数据 load(‘signal_data.mat’); % 假设信号数据保存在signal_data.mat文件中 % 构建ESMD函数 esmd (x) esmd_decomposition(x); % 对信号进行ESMD分解 components esmd(signal_data); % 显示分解结果 figure; subplot(length(components)1,1,1); plot(signal_…