OpenCV漫水填充函数floodFill函数的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

功能描述

        ffloodFill函数是OpenCV库中用于图像处理的一个功能,它用于填充与种子点颜色相近的连通区域。这个函数在很多场景下都非常有用,比如图像分割、对象填充或改变图像中某个区域的颜色等。

        连通性的判断基于邻近像素的颜色或亮度接近程度。如果像素位于(x,y)处被认为属于要重新上色的连通域,需满足以下条件:

  • 对于灰度图像和浮动范围的情况:
    src ( x ′ , y ′ ) − loDiff ≤ src ( x , y ) ≤ src ( x ′ , y ′ ) + upDiff \texttt{src} (x',y')- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} (x',y')+ \texttt{upDiff} src(x,y)loDiffsrc(x,y)src(x,y)+upDiff
  • 对于灰度图像和固定范围的情况:
    src ( seedPoint . x , seedPoint . y ) − loDiff ≤ src ( x , y ) ≤ src ( seedPoint . x , seedPoint . y ) + upDiff \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)+ \texttt{upDiff} src(seedPoint.x,seedPoint.y)loDiffsrc(x,y)src(seedPoint.x,seedPoint.y)+upDiff
  • 对于彩色图像和浮动范围的情况:
    src ( x ′ , y ′ ) r − loDiff r ≤ src ( x , y ) r ≤ src ( x ′ , y ′ ) r + upDiff r , \texttt{src} (x',y')_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} (x',y')_r+ \texttt{upDiff} _r, src(x,y)rloDiffrsrc(x,y)rsrc(x,y)r+upDiffr, src ( x ′ , y ′ ) g − loDiff g ≤ src ( x , y ) g ≤ src ( x ′ , y ′ ) g + upDiff g \texttt{src} (x',y')_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} (x',y')_g+ \texttt{upDiff} _g src(x,y)gloDiffgsrc(x,y)gsrc(x,y)g+upDiffg
    并且:
    src ( x ′ , y ′ ) b − loDiff b ≤ src ( x , y ) b ≤ src ( x ′ , y ′ ) b + upDiff b \texttt{src} (x',y')_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} (x',y')_b+ \texttt{upDiff} _b src(x,y)bloDiffbsrc(x,y)bsrc(x,y)b+upDiffb
  • 对于彩色图像和固定范围的情况:
    src ( seedPoint . x , seedPoint . y ) r − loDiff r ≤ src ( x , y ) r ≤ src ( seedPoint . x , seedPoint . y ) r + upDiff r , \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r+ \texttt{upDiff} _r, src(seedPoint.x,seedPoint.y)rloDiffrsrc(x,y)rsrc(seedPoint.x,seedPoint.y)r+upDiffr, src ( seedPoint . x , seedPoint . y ) g − loDiff g ≤ src ( x , y ) g ≤ src ( seedPoint . x , seedPoint . y ) g + upDiff g \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g+ \texttt{upDiff} _g src(seedPoint.x,seedPoint.y)gloDiffgsrc(x,y)gsrc(seedPoint.x,seedPoint.y)g+upDiffg
    并且:
    src ( seedPoint . x , seedPoint . y ) b − loDiff b ≤ src ( x , y ) b ≤ src ( seedPoint . x , seedPoint . y ) b + upDiff b \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b+ \texttt{upDiff} _b src(seedPoint.x,seedPoint.y)bloDiffbsrc(x,y)bsrc(seedPoint.x,seedPoint.y)b+upDiffb
    其中 s r c ( x ′ , y ′ ) src(x',y') src(x,y)是已经被判定属于该连通组件的某个邻居像素的值。要被添加到连通组件中,像素的颜色或亮度应该足够接近:
  • 如果使用浮动范围,它应该接近其一个已经属于连通组件的邻居的颜色或亮度。
  • 如果使用固定范围,它应该接近种子点的颜色或亮度。

这些函数可用于以下操作:

  • 直接在原图上用指定的颜色标记一个连通组件。
  • 构建一个掩模,然后提取轮廓。
  • 复制区域到另一个图像,等等。

函数原型1


int cv::floodFill	
(InputOutputArray 	image,InputOutputArray 	mask,Point 	seedPoint,Scalar 	newVal,Rect * 	rect = 0,Scalar 	loDiff = Scalar(),Scalar 	upDiff = Scalar(),int 	flags = 4 
)		

参数1

  • 参数image:输入/输出的1-或3-通道、8位或浮点图像。除非在函数的第二个变体中设置了FLOODFILL_MASK_ONLY标志,否则该图像将被函数修改。详情请见下方说明。
  • 参数mask:操作掩模,应当是一个比图像宽2像素、高2像素的单通道8位图像。如果传递空的Mat对象,它将被自动创建。由于这是一个输入和输出参数,你必须负责初始化它。洪水填充不会跨越输入掩模中非零像素。例如,边缘检测的输出可以用作掩模,以在边缘处停止填充。输出时,掩模中对应于图像中填充像素的像素将被设置为1或在flags中指定的值,如下文所述。此外,函数会在掩模的边界填充1,以简化内部处理。因此,可以在多次调用函数时使用同一掩模,以确保填充的区域不会重叠。
  • 参数seedPoint:填充的起始点。
  • 参数newVal:重绘区域像素的新值。
  • 参数loDiff:当前观察像素与其属于同一连通组件的邻居像素,或加入连通组件的种子像素之间的最大下限亮度/颜色差异。
  • 参数upDiff:当前观察像素与其属于同一连通组件的邻居像素,或加入连通组件的种子像素之间的最大上限亮度/颜色差异。
  • 参数rect:可选的输出参数,由函数设置为重绘区域的最小边界矩形。
  • 参数flags:操作标志。前8位包含连通性值。默认值4意味着仅考虑四个最近邻像素(那些共享边缘的像素)。连通性值8意味着将考虑八个最近邻像素(那些共享角落的像素)。接下来的8位(8-16位)包含一个1到255之间的值,用于填充掩模(默认值是1)。例如,4 | ( 255 << 8 )将考虑四个最近邻并用255填充掩模。以下附加选项占据更高位,因此可以使用按位或(|)与连通性和掩模填充值进一步组合,请参阅FloodFillFlags。

注释
       由于掩模比填充的图像大,图像中的像素(x,y)对应于掩模中的像素(x+1,y+1)。

另见:

findContours:查找轮廓的函数。

函数原型2


int cv::floodFill	
(InputOutputArray 	image,Point 	seedPoint,Scalar 	newVal,Rect * 	rect = 0,Scalar 	loDiff = Scalar(),Scalar 	upDiff = Scalar(),int 	flags = 4 
)		

参数2

比原型1少了个mask参数,其他参数都一样。

代码示例

include <iostream>
#include <opencv2/opencv.hpp>int main()
{cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg" );if ( img.empty() ){std::cout << "Could not read the image" << std::endl;return -1;}cv::Point seedPoint( 359, 578 );  // 假设种子点为(359, 578)cv::Scalar newVal( 255, 0, 0 );   // 新的颜色值为蓝色cv::Rect roi;int flags = 8;// 进行填充cv::floodFill( img, seedPoint, newVal, &roi, cv::Scalar( 1, 1, 1 ), cv::Scalar( 40, 40, 40 ), 8 );// 显示结果cv::imshow( "Flood Fill Result", img );cv::waitKey();return 0;
}

运行结果

原图:
在这里插入图片描述
运算之后的图:
蓝色部分就是填充的部分,参数loDiff为Scalar(1, 1, 1),upDiff为Scalar(40, 40, 40),表示当前观测点的像素X与周围已被填充的像素点数值Y,需满足X-Y<10,且Y-X<1,才被填充。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45038.shtml

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

相关文章

MUR2060CTR-ASEMI无人机专用MUR2060CTR

编辑&#xff1a;ll MUR2060CTR-ASEMI无人机专用MUR2060CTR 型号&#xff1a;MUR2060CTR 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环峰值反向电压&#xff08;VRRM&#…

【数据结构】线性表----队列详解

1. 队列的基本概念 话不多说&#xff0c;直接开始&#xff01; 队列是一种线性数据结构&#xff0c;同栈类似但又不同&#xff0c;遵循先进先出&#xff08;FIFO, First In First Out&#xff09;的原则。换句话说&#xff0c;最先进入队列的元素会最先被移除。这样的特点使得…

小白学python(第七天)

哈哈&#xff0c;这个系列的文章也有一段时间没更新&#xff0c;主要是最近在忙c嘎嘎&#xff0c;不过没事接下来会优先更python啦&#xff0c;那么我们先进入正题吧 函数的定义及调用 函数定义 格式&#xff1a;def 函数名&#xff08;形参列表&#xff09;&#xff1a; 语…

QTabWidget、QListWidget、QStackedWidget

The QTabWidget class provides a stack of tabbed widgets. More... The QListWidget class provides an item-based list widget. More... QStringList strlist;strlist<<"系统"<<"外观"<<"截图"<<"贴图"…

.NET MAUI开源架构_4..NET MAUI 应用支持的平台

可以针对以下平台编写 .NET Multi-platform App UI (.NET MAUI) 应用&#xff1a; 需要 Android 5.0 (API 21) 或更高版本。需要 iOS 11 或更高版本使用 Mac Catalyst 的 macOS 11 或更高版本。Windows 11 和 Windows 10 版本 1809 或更高版本&#xff0c;使用 Windows UI 库 …

Java的高级特性

类的继承 继承是从已有的类中派生出新的类&#xff0c;新的类能拥有已有类的属性和行为&#xff0c;并且可以拓展新的属性和行为 public class 子类 extends 父类{子类类体 } 优点 代码的复用 提高编码效率 易于维护 使类与类产生关联&#xff0c;是多态的前提 缺点 类缺乏独…

c/c++ 打印调用栈

打印调用栈可以在程序出现死机的时候&#xff08;如出现 SIGABRT、SIGSEGV等一些信号错误&#xff09;是很有用的信息&#xff0c;有可能就不需要 core file 来协助排查问题了。通过 man backtrace 可以得到一个例子的源码&#xff1a; #define SIZE 100 static void backTrac…

【机器学习-00】机器学习是什么?

在科技飞速发展的今天&#xff0c;机器学习已成为一个热门话题&#xff0c;广泛应用于各个行业和领域。那么&#xff0c;机器学习到底是什么&#xff1f;它又是如何工作的&#xff1f;本文将深入探讨机器学习的定义、原理及其在各领域的应用&#xff0c;带领读者走进这个神秘而…

RedisTemplate 中序列化方式辨析

在Spring Data Redis中&#xff0c;RedisTemplate 是操作Redis的核心类&#xff0c;它提供了丰富的API来与Redis进行交互。由于Redis是一个键值存储系统&#xff0c;它存储的是字节序列&#xff0c;因此在使用RedisTemplate时&#xff0c;需要指定键&#xff08;Key&#xff09…

力扣题解( 等差数列划分 II - 子序列)

446. 等差数列划分 II - 子序列 给你一个整数数组 nums &#xff0c;返回 nums 中所有 等差子序列 的数目。 如果一个序列中 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该序列为等差序列。 例如&#xff0c;[1, 3, 5, 7, 9]、[7, 7, 7, 7] 和…

Netgear WN604 downloadFile.php 信息泄露漏洞复现(CVE-2024-6646)

0x01 产品简介 NETGEAR WN604是一款由NETGEAR(网件)公司生产的无线接入器(或无线路由器)提供Wi-Fi保护协议(WPA2-PSK, WPA-PSK),以及有线等效加密(WEP)64位、128位和152位支持,保障网络安全。同时支持MAC地址认证、802.1x RADIUS以及EAP TLS、TTLS、PEAP等安全机制,…

Flat Ads:金融APP海外广告投放素材的优化指南

在当今全球化的数字营销环境中,金融APP的海外营销推广已成为众多金融机构与开发者最为关注的环节之一。面对不同地域、文化及用户习惯的挑战,如何优化广告素材,以吸引目标受众的注意并促成有效转化,成为了广告主们亟待解决的问题。 作为领先的全球化营销推广平台,Flat Ads凭借…

超简易高效的 AI绘图工具—与sd-webui一致界面,6G显存最高提升75%出图速率!(附安装包)

大家好&#xff0c;我是灵魂画师向阳 今天给大家分享一个基于Stable Diffusion WebUI 构建的AI绘图工具—sd-webui-forge&#xff0c;该工具的目标在于简化插件开发&#xff0c;优化资源管理&#xff0c;加速推理。 Forge承诺永远不会对Stable Diffusion WebUI用户界面添加不…

获奖案例回顾|基于卫星遥感和无人机的水稻全流程风险减量项目

引言 在现代农业保险领域&#xff0c;技术创新是推动行业进步的关键。珈和科技与太平财险的合作&#xff0c;旨在利用先进的卫星遥感和无人机技术&#xff0c;解决传统农业保险面临的诸多挑战&#xff0c;从而提升保险效率和服务质量。本次分享的项目案例获得了《金融电子化》…

启动yarn后,其他节点没有NodeManager

写在前面&#xff1a; 这个问题虽然折磨了我两天&#xff0c;但是原因特别蠢&#xff0c;可能与各位不一定一样&#xff0c;我是因为ResourceManager的节点的"/etc/hadoop/workers"文件没有配置好&#xff08;没有配hadoop102和hadoop104&#xff09;&#xff0c;但排…

数字图像处理(实践篇)四十八 PCA主成分分析降维与图像重建

目录 一 PCA 二 实践 实践① 实践② 一 PCA 主成分分析(PCA)是一种常见的数据分析技术,它可以用于降维和特征提取。 PCA 的作用包括以下几个方面: ①数据降维:PCA 可以将高维数据降维到低维空间中,从而方便后续的数据分析和可视化。可以将具有多个变量的数据集降维…

P1850换教室 题解(概率dp)

题目&#xff1a;https://www.luogu.com.cn/problem/P1850 思路&#xff1a; 概率dp,如果要求最小路径期望&#xff0c;我们要确定的有选了几节课&#xff0c;申请换了几节课&#xff0c;最后一节是否申请换课&#xff08;下一次选课要知道上一次选课申请情况&#xff09;。 …

小白学webgl合集-三维数据源和格式

大多数地图瓦片数据是二维的&#xff0c;三维效果通过渲染和样式设置实现。主要的三维数据源和格式包括&#xff1a; 1. 3D Tiles (CesiumJS) 3D Tiles 是一种开放标准&#xff0c;用于流式传输和可视化大规模三维地理数据。它可以包含各种三维数据&#xff0c;如建筑物、点云…

循环结构(二)——while语句【互三互三】

文章目录 &#x1f341;引言 &#x1f341;一、语句格式 &#x1f341;二、语句执行过程 &#x1f341;三、格式举例 &#x1f341;四、例题 &#x1f449;【例1】 &#x1f48e;【示例代码】 &#x1f449;【例2】 &#x1f680;【方法1】&#xff1a; &#x1f48e…

运维的操作红线

1. 无工单、邮件的任何操作&#xff0c;严禁执行。 2. 工单标题和内容不一致或工单内容超出现场范围禁止操作。 3. 操作前必须确定资产信息&#xff1a;机柜号、U位、资产号、sn 号、ip。 4. 机柜后门操作设备&#xff0c;必须多次执行第 3 条红线。 5. 严禁操作、触碰工单指定…