【OpenCV学习笔记】三十三、GrabCut & FloodFill图像分割

实战教程:使用OpenCV实现GrabCut图像分割 GrabCut是一种基于图像边缘分割的技术,它可以对给定的图像进行前景和背景的分割。本文将讲解如何使用OpenCV库实现GrabCut算法,并通过示例代码进行演示。通过以上示例代码,我们可以轻松实现GrabCut图像分割的功能,并通过鼠标交互的方式标记前景和背景区域,大大提高了分割的准确性。在此过程中,我们根据鼠标按键的不同来设置mask中对应像素的值,其中GC_FGD表示前景,GC_BGD表示背景。其中,GC_EVAL表示进行分割的标志位,输出的掩膜通过np.where函数设置前景和背景的像素值。 阅读详情

GrabCut & FloodFill图像分割

1.grabCut图像分割算法——grabCut()

2.漫水填充算法——floodFill()

先上ppt:

代码:1.利用Rect做GrabCut分割

///利用Rect做GrabCut分割
#include "opencv2/opencv.hpp"
using namespace cv;
Mat srcImg = imread("bird.jpg", CV_LOAD_IMAGE_COLOR);
Mat tempImg = srcImg.clone();
Mat copyImg = srcImg.clone();
Mat result;//定义输出图像
Rect rect;//定义Rect区域,包含分割对象的矩形ROI, 矩形外部的像素为背景, 矩形内部的像素为前景,当参数mode=GC_INIT_WITH_RECT使用
Mat bgdModel, fgdModel;//背景模型(内部使用)、前景模型(内部使用)
bool flag = false;//记录鼠标左键是否抬起的flag
Point start;//记录鼠标左键按下时的点
void onMouse(int event,int x, int y, int flags, void* param)
{
	switch (event)
	{
	case CV_EVENT_LBUTTONDOWN://鼠标左键按下
		flag = true;//flag置为true
		start = Point(x,y);//记录左键按下时的坐标点
		break;
	case CV_EVENT_MOUSEMOVE://鼠标移动
		if (flag)//如果flag为true
		{
			tempImg = copyImg.clone();//将tempImg置为原图的拷贝copyImg
			rectangle(tempImg, start, Point(x, y), Scalar(0, 255, 0), 1, 8);//画出矩形
			rect = Rect(start, Point(x, y));//定义Rect区域
		}
		break;
	case CV_EVENT_LBUTTONUP://鼠标左键抬起
		flag = false;//flag置为false
		break;
	default:
		break;
	}
	imshow("GrabCut", tempImg);//显示绘制上矩形的tempImg
}
int main()
{
	namedWindow("GrabCut",CV_WINDOW_AUTOSIZE);//新建窗口
	setMouseCallback("GrabCut",onMouse,0);//设置鼠标回调函数,依附于"GrabCut"窗口
	imshow("GrabCut", tempImg);//使得一开始就显示"GrabCut"窗口
	while (1)//无限循环,等待按键
	{
		if (waitKey(0) == 32)//如果按下空格键
		{
			//grabCut分割
			//注意:结果图像result中只有四种可能的取值:GC_BGD、GC_FGD、GC_PR_BGD及GC_PR_FGD
			grabCut(srcImg, result, rect, bgdModel, fgdModel, 1, GC_INIT_WITH_RECT);
			//CMP_EQ参数,将result中逐个像素与GC_PR_FGD比较,寻找出相同的像素,结果存进result中
			compare(result, GC_PR_FGD, result, CMP_EQ);
			imshow("result", result);
		}
	}
	waitKey(0);
	return 0;
}

运行结果:

代码:2.利用mask做GrabCut分割

///利用mask做GrabCut分割
//未做,待补

运行结果:待补

代码:3.漫水填充算法

///漫水填充算法
#include "opencv2/opencv.hpp"
using namespace cv;
Mat srcImg = imread("bird.jpg", CV_LOAD_IMAGE_COLOR);
Point seedPoint;//种子点, 漫水填充算法起始点
Scalar newVal = Scalar(rand() % 255, rand() % 255, rand() % 255);//像素点被染颜色的值, 即在重绘区域像素的新值
Scalar loDiff = Scalar(10, 10, 10);//待理解
Scalar upDiff = Scalar(10, 10, 10);//待理解
void onMouse(int event, int x, int y, int flags, void* param)
{
	switch (event)
	{
	case CV_EVENT_LBUTTONDOWN://鼠标左键按下
		seedPoint = Point(x, y);//此时位置即为种子点
		floodFill(srcImg, seedPoint, newVal, 0, loDiff, upDiff);// 漫水填充算法
		break;
	}
	imshow("floodFill", srcImg);//显示floodFill后的srcImg
}
int main()
{
	namedWindow("floodFill", CV_WINDOW_AUTOSIZE);//新建窗口
	setMouseCallback("floodFill", onMouse, 0);//设置鼠标回调函数,依附于"floodFill"窗口
	imshow("floodFill", srcImg);//使得一开始就显示"floodFill"窗口
	waitKey(0);
	return 0;
}

运行结果:

OpenCV GrabCut 图像分割的实例 编程 图像分割是计算机视觉领域中的重要任务,它可以将图像分割成具有不同语义含义的区域。GrabCut 是 OpenCV 中一种常用的图像分割算法,它能够将图像中的前景和背景分割出来。在本篇文章中,我将为您介绍如何使用 OpenCV 的 GrabCut 算法进行图像分割,并提供相应的源代码。通过调整矩形边界框的位置和大小,您可以选择不同的前景区域进行分割。接下来,我们根据掩码的值将可能的前景和可能的背景像素设置为实际的前景和背景值。首先,确保您已经安装了 OpenCV 库,并且在您的代码中导入了相关的库文件。 阅读详情

相关推荐

opencv(c++)------图像分割(阙值、自适应阙值、grabCut、floodfill、wathershed)

1.阈值分割

m0_47405013的博客 2026

opencv图像分割 --- Grabcut图像分割

Grabcut图像分割与GMM、KMeans、分水岭分割的区别在于, Grabcut图像分割是用户可以。选择目标图像,然后将剩余的作为背景,目标作为前景进行分割,这样可以把目标提取出来,也就。而其他三个分割算法是不需要人为干预的,通过算法将图像分割为几个部分。Grabcut 算法主要运用于计算机视觉中的。,这时候就可以对GMM进行建模和完成良好的分割了。只要少量的用户交互操作即可得到比较好的分割结。1. Grabcut 的目标和背景的模型是。3. Grab Cut只需要提供。2. Grab Cut为一个。

m0_60005621的博客 1397

OpenCV入门(十六)快速学会OpenCV 15 图像分割

图像分割主要是指将图像分成各具特性的区域并提取出感兴趣目标的技术。图像分割是数字图像分析中的重要环节,在整个研究中起着承前启后的作用,既是对所有图像预处理效果的一个检验,也是后续进行图像分析与解译的基础。图像阈值化分割是一种传统的、最常用的图像分割方法,因其实现简单、计算量小、性能较稳定,成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像,在很多情况下是进行图像分析、特征提取与模式识别之前必要的图像预处理过程。

小幽余生不加糖 3225

OpenCV笔记15 图像分割--GrabCut算法

一、基本概念 GraphCut是一种直接基于图割算法的图像分割技术, 仅仅需要确认前景和背景输入, 该算法就可以完成前景和背景的最优分割,该算法利用了图像中的纹理(颜色)信息和边界(反差)信息, 只要少量的用户交互操作即可得到比较好的分割结果, 和分水岭算法比较相似, 但是计算速度比较慢, 得到的结果比较精确。步骤如下: GrabCut算法的实现步骤: 在图片中定义(一个或者多个)包含物体的矩形。 矩形外的区域被自动认为是背景。 对于用户定义的矩形区域,可用背景中的数据来区分它里面的前景和背景区域

weixin_39354845的博客 3300

C#图像处理-OpenCVSharp教程(三十) OpenCVSharp GrabCut & FloodFill图像分割

本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp GrabCut & FloodFill图像分割!

Color Space的博客 2441

OpenCV计算机视觉实战(16)——图像分割技术

本节从分水岭的高程地图思路切入,讲解如何借助距离变换与连通组件构建水漫分割,再通过 GrabCut 的图割模型与用户交互实现更高精度的前景去背,最后以 FloodFill 的种子驱动方式演示快速区域生长。三者各有侧重,却可互为补充:分水岭适合自动化预分割,GrabCut 适合复杂边缘细化,FloodFill 则胜在简单直观和交互式应用。

qq_30167691的博客 1495

opencv(28)---GrabCut & FloodFill图像分割

GrabCut图像分割算法 基本概念 OpenCV中的GrabCut算法是Graphcut算法的改进, Graphcut是一种直接基于图割算法的图像分割技术, 仅仅需要确认前景和背景输入, 该算法就可以完成前景和背景的最优分割, 算法依据《“GrabCut” - Interactive Foreground Extraction using Iterated Graph Cuts》这篇文章来实...

weixin_39609623的博客 280

floodfill 区域生长法 opencv

基于vs2010与opencv采用区域生长法实现的图像分割法,经调试可用,一个挺简单的源程序,可供初学者参考

OpenCV C++ 边缘检测与图像分割

在图像中,边缘可以看作是局部区域内像素灰度值的不连续性。从数学角度理解,灰度值的变化率在边缘处会出现显著变化。例如,在一幅黑白图像中,从黑色区域过渡到白色区域的边界处,像素灰度值会从较低值突然跃升至较高值,这个过渡区域就是边缘所在之处。

2301_76564925的博客 2058

Grabcut 原文PPt

图像分割经典算法——Grabcut的论文PPt,对初学者理解很有帮助~

手把手教你用树莓派蓝牙抓取小米温湿度计2代数据,接入HomeAssistant(附密钥获取避坑指南)

本文详细介绍了如何通过树莓派蓝牙抓取小米温湿度计2代数据并接入HomeAssistant的完整流程。重点解析了获取32位加密密钥的三种方法,包括使用Telink Flasher工具、米家APP抓包和开源工具ATC_MiThermometer,并提供了HomeAssistant集成配置和常见问题排查指南,帮助用户实现稳定可靠的温湿度监测。

一名菜鸟攻城师 777

OpenCV入门(十)——图像分割技术

0x01 FloodFill分割 FloodFill泛洪填充算法是在很多图形绘制软件中常用的填充算法,通常来说是自动选中与种子像素相关的区域,利用指定的颜色进行区域颜色替换,可用于标记或分离图形的某些部分。比如windows系统中的图像编辑软件中的油漆桶这一功能,或者是Photoshop的魔术棒选择工具,都是通过FloorFill泛洪填充来改进和延伸的。 (一)原理 从一个点开始遍历附近的像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充成新颜色为止。 (二)常见方法 4邻域像素填充法、8

Alkaid2000的博客 5028

手把手教你用Matlab解析Zygo .dat文件:从二进制数据到面形图(附完整流程)

本文详细介绍了如何使用Matlab解析Zygo干涉仪生成的.dat文件,从二进制数据读取到面形图可视化的完整流程。通过实例代码演示了文件结构解析、数据矩阵读取、高阶Zernike拟合等关键技术,帮助工程师和研究人员高效处理光学检测数据,提升分析精度和工作效率。

weixin_30731305的博客 447

floodfill算法 java_Opencv 处理图像的颜色

1、用策略模式比较颜色策略设计模式是一种面向对象的设计模式。这种模式尽可能地将算法的复杂性隐藏在一个直观的编程借口后面,更有利于算法的部署。注意:在现代体系中,浮点数的欧几里得距离的计算速度比(RGB差值的绝对值)进行累加。2、计算向量的欧几里得范数的函数return static_cast(cv::Vec3i(color[0]-target[0],color[1]-target[1],color...

weixin_26846533的博客 445

提升ARM Cortex-M系统性能的关键技术:TCM技术解析与实战指南

TCM技术为ARM Cortex-M处理器提供了宝贵的确定性性能提升手段,特别适合对时序敏感的实时应用。通过合理配置和优化,工程师可以显著提高系统性能、降低中断响应时间并优化功耗。随着嵌入式系统对实时性要求的不断提高,TCM技术将在工业控制、汽车电子、医疗设备等领域发挥更加重要的作用。未来,ARM处理器可能会进一步扩展TCM容量并优化其与其他内存子系统的协同工作方式,为开发者提供更强大的实时性能保障。

1678

C#解析基恩士(KEYENCE)PLC数据:KV协议通信与实时监控实现

KV协议是基恩士PLC使用的一种专用通信协议,通常用于与上位机进行数据交换。KV协议通过RS-232C、RS-485、Ethernet等接口与上位机通信,支持多种数据类型的读写,包括但不限于位、字、双字、浮点数等。简洁易用:KV协议的通信格式简单,易于实现。支持多种数据类型:支持位数据、字数据、定长字符串等。高效实时性:能够提供较高的实时数据交换性能,适合实时监控应用。本文介绍了如何通过C#与基恩士KV系列PLC进行通信,实现数据的解析和实时监控功能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1806

OpenCV4X学习-图像边缘检测、图像分割

本文介绍了图像边缘检测和图像分割的基本概念、方法和应用。主要内容包括: 图像边缘检测 定义:检测图像中灰度值急剧变化的物体边界 常用方法: 基于梯度:Sobel、Prewitt算子 基于二阶导数:Laplacian算子 Canny边缘检测(多阶段算法) 图像分割 定义:将图像划分为有意义的区域 目的:简化图像表示、目标识别、图像理解 应用领域:计算机视觉、医学影像、机器人视觉等 主要方法: 阈值分割 区域分割 边缘分割 聚类分割 深度学习方法 文中提供了Sobel、Laplacian和Canny算子的代码实

qq_43441284的博客 1332

Altium Designer (AD) 设计软件高频面试题及参考答案(3万字长文)

在Altium Designer(AD)中,设计复用是一种关键的策略,它允许设计师在多个项目中重复使用经过验证的设计元素,如原理图符号、PCB布局、元器件封装和设计规则集。在Altium Designer (AD) 中,手动布线和交互式布线是PCB设计中常见的两种布线模式,它们提供了设计师对布线路径的直接控制,特别是在处理复杂或关键信号路径时尤为有用。在Altium Designer (AD) 中进行电路级仿真是一项重要的设计验证步骤,它允许设计师在实际制造之前对电路的行为进行预测和分析。

大模型大数据攻城狮的专栏 4781

OpenCV快速入门:图像分析——图像分割和图像修复

本篇博客旨在提供一个关于OpenCV中图像分割和图像修复技术的入门指南,从基本原理到代码实现,简要覆盖这些技术的关键方面。

吾家有猫名探花的博客 2120

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

安装这个软件之前先安装VisualStudio,本文安装这个软件时已经安装了VisualStudio2019。1、下载倍福PLC编程软件TwinCAT。

qq_34059233的博客 3663

【人工智能】提示词工程:让大模型精准响应的核心技术,提示词的基础框架 以及 常见提示词框架及场景

编写提示词的基础原则包括:简单、明确、详细,提示词拥有零样本提示、少样本提示、分配角色、提示写作风格、限定输出格式等技巧。

奶爸的编程之路,也就一周冷个三天 1138

opencv学习之路(31)、GrabCut & FloodFill图像分割

一、GrabCut 1、利用Rect做分割 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat src = imread("E://bird.jpg"); Rect rect(84, 84, 406, 318);//左上坐标(X,Y)和长宽 Mat res...

weixin_30933531的博客 194

QCM2290 PM-3 如何让mirco-usb支持关机充电

PM4125-3插入type-C触发开机进入关机充电的CC脚中断条件是否可以软件上屏蔽, 做到只通过VBUS中断即可触发进入关机充电模式,达到和PM4125-2的效果一样只要插入micro USB 就可以触发进入关机充电模式。硬件团队提议修改寄存器 SCHG_L_MISC_SYSOK_CFG 0x164A bit[4] 目前修改如下 — a/BOOT.XF.4.1/boot_images/QcomPkg/Library/PmicLib/target/Agatti_pmCocos/psi/pm_confi

墨染天玑的博客 441

OpenCV4 快速入门 学习笔记分享【第八章】

至此,第八章就结束了,望各位读者“一键三连”有任何问题欢迎评论区留言或者私信。

2201_75933254的博客 799

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 【OpenCV学习笔记】三十一、轮廓特征属性及应用(八)——颜色物体识别与跟踪
下一篇: 【OpenCV学习笔记】二十二、直方图计算及绘制(二)
DetailAI
博客等级 码龄10年 499粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值