当前位置: 首页 > news >正文

图像分割-漫水填充法 floodFill (C#)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

本文的VB版本请访问:图像分割-漫水填充法 floodFill-CSDN博客

FloodFill方法是一种图像处理算法,它的目的是将一个闭合的区域内的像素全部涂上同一个颜色。在实现中,通常会使用递归或队列来处理待处理列表。具体的实现方式会根据具体应用场景的需求而有所不同。

CvInvoke.FloodFill方法用于执行图像的漫水填充操作,它将连通区域中的所有像素点填充为指定颜色的操作。该方法声明如下:

public static int FloodFill(

           IInputOutputArray src,

                    IInputOutputArray mask,

                    Point seedPoint,

                    MCvScalar newVal,

                    out Rectangle rect,

                    MCvScalar loDiff,

                    MCvScalar upDiff,

                    Connectivity connectivity = Connectivity.FourConnected,

           FloodFillType flags = FloodFillType.Default

)

参数说明:

  1. src:输入输出的图像,必须是单通道灰度图像或三通道彩色图像。
  2. mask:掩码图像,必须是单通道8位图像,并且高宽各比源图像大2。如果指定了掩码,则只有掩码中像素值为255的区域才会被填充或者标记。如果不指定掩码,则默认填充或者标记整个图像。
  3. seedPoint:表示种子点的坐标,即从哪个像素点开始填充或者标记连通区域。
  4. newVal:填充的新颜色,可以是一个标量值(单通道图像)或一个包含三个通道值的MCvScalar结构体(三通道图像)。
  5. rect:输出参数,表示被填充区域的边界矩形。
  6. loDiff:低阈值向量。如果相邻像素点的值与种子点的差值小于低阈值向量,则将其归为同一连通区域。
  7. upDiff:高阈值向量。如果相邻像素点的值与种子点的差值大于高阈值向量,则将其归为不同的连通区域。
  8. connectivity:连接性,指定像素的相邻关系。默认为八连通。
  9. flags:漫水填充算法的标志位。默认为FixedRange,表示使用固定的阈值范围进行填充。

返回值:

返回一个整数值,表示填充的像素个数。

        //漫水填充法 floodFillprivate void Button1_Click(object sender, EventArgs e){Mat m = new Mat("C:\\learnEmgucv\\tower.jpg", ImreadModes.Color);//种子点的坐标Point seedPoint = new Point(100, 100);//填充颜色MCvScalar newVal = new MCvScalar(0, 255, 255);//掩码图像Mat mmask = new Mat();mmask = Mat.Zeros(m.Rows + 2, m.Cols + 2, DepthType.Cv8U, 1);Rectangle rect = new Rectangle();// 执行漫水填充int numFilledPixels = CvInvoke.FloodFill(m, mmask, seedPoint, newVal, out rect, new MCvScalar(10, 10, 10), new MCvScalar(20, 20, 20));//输出填充的像素个数Console.WriteLine("Number of filled pixels: " + numFilledPixels);//显示填充后的图像ImageBox1.Image = m;}

输出结果如下图所示:

图8-1漫水填充法实现图像分割

        //漫水填充法 floodFill//选取不同的起始点坐标进行填充private void Button2_Click(object sender, EventArgs e){Mat msrc = new Mat("c:\\learnEmgucv\\tower.jpg", ImreadModes.AnyColor);ImageBox1.Image = msrc;Mat mask = new Mat(msrc.Rows + 2, msrc.Cols + 2, DepthType.Cv8U, 1);int area;//从坐标(250, 250)进行填充Mat mdst1 = msrc.Clone();Rectangle outRec;area = CvInvoke.FloodFill(mdst1, mask,new Point(250, 250),new MCvScalar(0, 0, 255),out outRec,new MCvScalar(40, 40, 40),new MCvScalar(40, 40, 40),Connectivity.FourConnected,FloodFillType.FixedRange);CvInvoke.Imshow("mdst1", mdst1);//从坐标(400, 400)进行填充Mat mdst2 = msrc.Clone();area = CvInvoke.FloodFill(mdst2, mask,new Point(400, 400),new MCvScalar(0, 255, 0),out outRec,new MCvScalar(60, 60, 60),new MCvScalar(80, 80, 80),Connectivity.FourConnected,FloodFillType.FixedRange);CvInvoke.Imshow("mdst2", mdst2);}

输出结果如下图所示:

图8-2 不同坐标点填充效果

        //FloodFill随机坐标点使用随机颜色填充private void Button3_Click(object sender, EventArgs e){Mat msrc = new Mat("c:\\learnEmgucv\\tower.jpg", ImreadModes.AnyColor);ImageBox1.Image = msrc;Mat mask = new Mat(msrc.Rows + 2, msrc.Cols + 2, DepthType.Cv8U, 1);MCvScalar lodiff = new MCvScalar(20, 20, 20);MCvScalar hidiff = new MCvScalar(20, 20, 20);Random r = new Random();Rectangle outRec;for (int i = 0; i < 100; i++){int x = r.Next(msrc.Cols);int y = r.Next(msrc.Rows);Point p = new Point(x, y);MCvScalar newsc = new MCvScalar(r.Next(256), r.Next(256), r.Next(256));int area = CvInvoke.FloodFill(msrc, mask,p,newsc,out outRec,lodiff,hidiff,Connectivity.FourConnected,FloodFillType.FixedRange);}CvInvoke.Imshow("mout", msrc);}

输出结果如下图所示:

图8-3 随机坐标点使用随机颜色填充

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。

学习更多vb.net知识,请参看vb.net 教程 目录

相关文章:

图像分割-漫水填充法 floodFill (C#)

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的VB版本请访问&#xff1a;图像分割-漫水填充法 floodFill-CSDN博客 FloodFill方法是一种图像处理算法&#xff0c;它的目的是…...

在pycharm中jupyter连接上了以后显示无此库,但是确实已经安装好了某个库,使用python可以跑,但是使用ipython就跑不了

今天遇到一个事情&#xff0c;就是用pycharm的jupyter时&#xff0c;连接不上&#xff0c;后来手动连接上了以后&#xff0c;发现环境好像不对。 一般来说&#xff0c;这里会是python3&#xff0c;所以里面的环境也是普通python的环境&#xff0c;并没有我下载的库&#xff0c;…...

C++多态性——(3)动态联编的实现——虚函数

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 成功的秘诀就在于多努力一次&#xff…...

docker部署mysql

1.查找mysql镜像 [rootVM-4-5-centos ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-sourc…...

python代码大全(持续更新)

读写文件 # 读取文件 with open(file.txt, r) as file:content file.read()# 写入文件 with open(file.txt, w) as file:file.write(Hello, World!)HTTP请求 import requestsresponse requests.get(https://api.example.com/data) data response.json()JSON处理 import j…...

C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 处理程序异常相关技术

C# 入门基础知识 - C# 处理程序异常相关技术 第11节 处理程序异常相关技术11.1 捕获异常11.2 清除、处理所有异常11.3 引发异常11.4 预定义异常类11.5 自定义异常类11.6 异常的综合运用 更多C#基础知识点可查看&#xff1a;C#学习笔记 - C#基础知识 - C#从入门到放弃 第11节 处…...

[python]项目怎么使用第三方库

要在Python项目中使用第三方库&#xff0c;可以按照以下步骤进行&#xff1a; 安装第三方库&#xff1a;使用pip命令安装要使用的第三方库。例如&#xff0c;要安装requests库&#xff0c;可以运行以下命令&#xff1a; pip install requests导入库文件&#xff1a;在Python项…...

java每日一题——双色球系统(答案及编程思路)

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;要求如下&#xff08;同时&#xff1a;红球每个号码不可以相同&#xff09; 编程思路&#xff1a;1&#xff0c;创建一个可以录入数字的数组&#xff1b;2&#xff0c;生成一个可以随机生成数字的数组&#xf…...

java的mybatis

一.spring 整合单元测试 二.lombok 三.注解方式开发 四.xml 方式开发 五.动态sql...

Linux驱动开发简易流程

推荐视频&#xff1a; 正点原子【第四期】手把手教你学 Linux之驱动开发篇 小智-学长嵌入式Linux&Android底层开发入门教程 能力矩阵 基础能力矩阵 熟悉c/c、熟悉数据结构 熟悉linux系统&#xff0c;Shell脚本&#xff0c;Makefile/cmake/mk 文件IO、多线程、竞争、并发…...

基于springboot的靓车汽车销售网站

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 研究背景 随…...

爬取涛声网音频

代码展现&#xff1a; 代码详情&#xff1a; import requests import re import os filename 声音// if not os.path.exists(filename): os.mkdir(filename) def down_load(page): for page in range(page): page page1 url https://www.tosound.…...

如何快速且有效的学习自动化测试?

我写一个学习路线吧&#xff1a; 1.学习python基本语法。 2学习路线图 https://www.processon.com/view/link/64e729486ece22263c3e 学习HTML/CSS下的html、xml、webservice三个教程。 3. 然后下一个python的requests库学习写最简单的网络爬虫。知乎上爬虫教程一大堆。 3是…...

openmmlab大模型实战营01

与环境进行交互——智能体更合适 模型微调常见方式 模型评测 模型部署常见问题你 大语言模型本身不具备最新信息和知识的获取&#xff0c;此时需要搭建包含不同模块的智能体框架 智能体&#xff1a;以大语言模型为核心&#xff0c;进行规划、推理和执行...

HarmonyOS-ArkTS基本语法及声明式UI描述

初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#xff0c;建议开发者具备TS语…...

字符串转成时间的SQL,一个多种数据库通用的函数

select date 2010-10-06 from dual; date 函数&#xff0c;此函数适用于&#xff1a; 1.MySQL数据库 2.Oracle数据库 3.达梦数据库 4.人大金仓数据库...

CMake入门教程【核心篇】查找包(find_package)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1.使用方法1.1基本用…...

Stable Diffusion好用的显卡推荐

Stable Diffusion 是一款顶级的人工智能艺术生成工具&#xff0c;以其快速的性能、用户友好的界面和显着的效果而闻名。然而&#xff0c;在沉浸体验之前&#xff0c;有必要验证您的计算机&#xff08;显卡&#xff09;是否符合最佳功能所需的严格规范。今天我们将介绍三款高性价…...

Spring 对请求参数的优雅处方式(重写序列化方法)

Spring 对请求参数的优雅处方式&#xff08;重写序列化方法&#xff09; 描述前端传参方式介绍代码实现&#xff1a;1、重写序列化方式代码2、设置类自动加载到 Spring 中 描述 在我们日常项目开发过程中&#xff0c;往往会遇到前端请求参数中有空格的情况&#xff0c;前端提交…...

2024年中职“网络安全“—数字调查取证(attack817.pcapng)

目录 ​1.通过分析数据包找出恶意用户最初访问HTTP服务的包号&#xff0c;将该值作为Flag值提交, Flag格式为flag{xxx}&#xff1b; 2.继续查看数据包文件分析出恶意用户扫描了哪些端口&#xff0c;将全部的端口号按照一定顺序作为Flag值&#xff0c;提示&#xff1a;注意端口…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

uniapp获取当前位置和经纬度信息

1.1. 获取当前位置和经纬度信息&#xff08;需要配置高的SDK&#xff09; 调用uni-app官方API中的uni.chooseLocation()&#xff0c;即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...