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

news2024/10/7 14:32:02

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

本文的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,表示使用固定的阈值范围进行填充。

返回值:

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

        //漫水填充法 floodFill
        private 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 教程 目录

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

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

相关文章

优维科技2024战略定位:新一代运维核心系统提供商

01 经济复苏「走远路」 过去几年&#xff0c;全球经济持续低迷&#xff0c;2024会迎来转机吗&#xff1f; 回顾2023年&#xff0c;尽管经济复苏动能式微&#xff0c;但全球经济因有效控制通胀而展现出来的韧性&#xff0c;让包括中国在内的大部分经济体躲过了深度衰退的陷阱&…

(NeRF学习)NeRFStudio安装win11

参考&#xff1a; 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程nerfstudio介绍及在windows上的配置、使用NeRFStudio官网githubRuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory原因及解决 目录 requireme…

二叉树的层序遍历,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 方法分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码补充说明&#xff1a; 题目地址&#xff1a; 102. 二叉树的层序遍历 - 力扣&…

使用华为云鲲鹏弹性云服务器部署Discuz

本实验将在华为云鲲鹏弹性云服务器CentOS系统的实例上&#xff0c;部署Discuz!项目&#xff0c;并进行初步的安装测试。 注意&#xff1a;官网文档有些链接失效&#xff0c;本文在官方文档的基础上作出修改&#xff0c;具体参见Discuz安装这一步 操作前提&#xff1a;登录华为…

Unity中Shader的Reversed-Z(DirectX平台)

文章目录 前言一、在对裁剪坐标归一化设置NDC时&#xff0c;DirectX平台Z的特殊二、在图形计算器中&#xff0c;看一下Z值反转前后变化1、在图形计算器创建两个变量 n 和 f 分别 控制近裁剪面 和 远裁剪面2、带入公式得到齐次裁剪空间下Z值3、进行透视除法4、用 1 - Z 得出Z值反…

邮件群发称呼怎么写?写群发邮件开头技巧?

如何写外贸邮件群发称呼&#xff1f;外贸群发邮件开头怎么称呼&#xff1f; 邮件群发已成为企业、个人和组织之间沟通的重要手段。而一个恰当的称呼&#xff0c;不仅能够展现出礼貌和尊重&#xff0c;还能够拉近彼此的距离。那么&#xff0c;如何写好邮件群发的称呼呢&#xf…

Java 读取超大excel文件

注意&#xff1a;此参考解决方案只是针对xlsx格式的excel文件&#xff01; Maven <dependency><groupId>com.monitorjbl</groupId><artifactId>xlsx-streamer</artifactId><version>2.2.0</version> </dependency>读取方式1…

杰发科技AutoGen自动生成7801代码——PWM

1.AutoGen生成代码非常简单&#xff0c;1s输出PWM波 只需修改如下频率和占空比即可 注意Pin脚对应的通道号是否正确 2.生成的代码可以直接编译烧录 3.结果

无边界支付:数字货币如何改变跨境电商?

在全球数字化的浪潮中&#xff0c;数字货币的崛起成为跨境电商领域的一场革命。本文将深入探讨数字货币如何重新定义支付体系&#xff0c;对跨境电商带来的影响以及未来可能的发展方向。 数字货币的崛起 随着比特币等数字货币的逐渐走俏&#xff0c;传统支付体系的边界逐渐被打…

微信服务号升级订阅号条件

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要看一下服务号和订阅号的主要区别。1、服务号推送的消息没有折叠&#xff0c;消息出现在聊天列表中&#xff0c;会像收到消息一样有提醒。而订阅号推送的消息是折叠的&#xff0c;“订阅号…

【linux kernel】linux的SPI框架分析

文章目录 一、linux内核中的SPI框架二、SPI核心的初始化三、SPI核心的数据结构1、struct spi_statistics2、struct spi_delay3、struct spi_device4、struct spi_driver5、struct spi_controller6、struct spi_res7、struct spi_transfer8、struct spi_message9、struct spi_bo…

MongoDB实验——在MongoDB中管理数据库和集合操作

实验——在MongoDB中管理数据库和集合操作 一、实验目的 掌握在 MongoDB 中管理数据库和集合操作掌握在 MongoDB 中插入、修改及删除文档操作 二、实验原理 MongoDB 中数据被分组存储在数据集中&#xff0c;被称为一个集合&#xff08;Collenction&#xff09;。对于存储在…

KBDPL.DLL文件丢失,软件游戏无法启动,修复方法

不少小伙伴&#xff0c;求助说遇到Windows弹窗提示“KBDPL.DLL文件丢失&#xff0c;应用无法启动的问题”&#xff0c;不知道应该怎么修复&#xff1f; 首先&#xff0c;先来了解“KBDPL.DLL文件”是什么&#xff1f; kbdpl.dll是Windows操作系统的一部分&#xff0c;是一个动…

深度学习MLP_实战演练使用感知机用于感情识别_keras

目录 &#xff08;1&#xff09;why deep learning is game changing?&#xff08;2&#xff09;it all started with a neuron&#xff08;3&#xff09;Perceptron&#xff08;4&#xff09;Perceptron for Binary Classification&#xff08;5&#xff09;put it all toget…

《论文阅读》基于情绪-原因转换图的共情回复生成

《论文阅读》基于情绪-原因转换图的共情回复生成 前言摘要模型架构图构建回复概念预测回复生成前言 今天为大家带来的是《EMPATHETIC RESPONSE GENERATION VIA EMOTION CAUSE TRANSITION GRAPH》 出版: 时间:2023.2.23 类型:共情对话生成 关键词:图网络;共情回复;情绪…

Maven 整理(含面试题)

Maven是Java 项目必备&#xff0c;Maven 主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。项目构建工具 、更好的管理依赖 目录 Maven安装与运行maven 重要知识点面试题 Maven安装与运行 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建、依赖管理…

石头剪刀布游戏 - 华为OD统一考试

OD统一考试 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 石头剪刀布游戏有 3 种出拳形状: 石头、剪刀、布。分别用字母 A,B,C 表示游戏规则&#xff1a; 出拳形状之间的胜负规则如下: A>B; B>C; C>A&#xff1b; 左边一个字母&#xff0c;…

Opencv(C++)学习之cv::calcHist 任意bin数量进行直方图计算

**背景&#xff1a;**当前网上常见的直方图使用方法都是默认使用256的范围&#xff0c;而对于使用特定范围的直方图方法讲的不够清楚。仔细研究后总结如下&#xff1a; 1、常见使用方法&#xff0c;直接对灰度图按256个Bin进行计算。 Mat mHistUn; int channels[1] { 0 }; {…

Django(五)

员工管理系统 1.新建项目 2.创建app python manage.py startapp app012.1 注册app 3. 设计表结构&#xff08;django&#xff09; from django.db import modelsclass Department(models.Model):""" 部门表 """title models.CharField(verbos…

Mysql 动态链接库配置步骤+ 完成封装init和close接口

1、创建新项目 动态链接库dll 2、将附带的文件都删除&#xff0c;创建LXMysql.cpp 3、项目设置 3.1、预编译头&#xff0c;不使用预编译头 3.2、添加头文件 3.3、添加类 3.4、写初始化函数 4、项目配置 4.1、右键解决方案-属性-常规-输出目录 ..\..\bin 4.2、生成lib文件 右…