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<<"系统"<<"外观"<<"截图"<<"贴图"…

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…

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 可以将高维数据降维到低维空间中,从而方便后续的数据分析和可视化。可以将具有多个变量的数据集降维…

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

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

【Java伴学笔记】Day-02 变量|计算机的存储方式|数据类型|标识符|键盘输入流

一、变量 在Java中&#xff0c;变量用于存储数据值&#xff0c;可以是数字、文本或其他类型的信息。Java中的变量必须声明后才能使用&#xff0c;并且每个变量都有特定的类型。下面是一些基本的变量使用示例&#xff1a; 声明一个整型变量并赋值&#xff1a; int myNumber; …

企业如何选择渲染农场?渲染100邀请码1a12

渲染农场能降低企业成本&#xff0c;帮助企业更好的服务客户&#xff0c;那么如何选择渲染农场呢&#xff1f;又有什么标准&#xff1f;这次我们就来看下。 1、渲染性能 渲染性能是衡量农场优劣的重要指标&#xff0c;性能越好农场越优质&#xff0c;性能主要包括渲染速度、稳…

一文快速接入银行卡识别API

银行卡识别API 能通过机器学习和图像识别技术来解析银行卡相关信息&#xff0c;根据用户上传卡片自动识别内容&#xff0c;返回该卡的卡号、所属银行及银行类型等信息。可以在用户需要输入银行卡等相关信息时使用该功能&#xff0c;帮助用户快速输入正确信息&#xff0c;简化用…

VPX3U架构+GPU景嘉微:基于飞腾处理器的全国产化刀片式板卡

近期承接了客户一个全国产的VPX3U的项目。搭载的飞腾FT2000系列处理器的VPX3U板卡。服务于某某部门。这款产品拥有全国产化及自主可控的硬件技术。以下是基于飞腾FT2000处理器的VPX3U主板的一些特点&#xff1a; ①飞腾FT2000系列处理器 处理器&#xff1a;板卡兼容飞腾FT2000…

【触摸屏】【红十字会学习系统】功能模块:视频 + AI拍照合成

项目背景 提升公众急救能力&#xff1a;确保每个人都能在紧急情况下采取正确的急救措施&#xff0c;减少伤害&#xff0c;挽救生命。培养人道主义价值观&#xff1a;通过教育和培训&#xff0c;传播红十字精神&#xff0c;促进社会对弱势群体的关注与支持。建立社区响应网络&a…