图像分割-漫水填充法 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,表示使用固定的阈值范围进行填充。

返回值:

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

        //漫水填充法 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.mfbz.cn/a/285332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

英伟达「摊牌」,朋友变对手

对于曾经拿着英伟达的GPU进行自动驾驶系统开发的初创公司来说&#xff0c;可能未必会想到&#xff1a;某一天&#xff0c;这家全球GPU巨头&#xff0c;曾经的合作伙伴会成为自己的直接竞争对手。 上周&#xff0c;英伟达官方公众号发布招聘消息&#xff0c;公司正在扩大其自动驾…

算法训练营Day34(贪心算法)

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 秒了 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {Arrays.sort(nums);// -4 -3 -2 -1 5//-2 -2 0 2 5int last -1;for(int i 0;i<…

从马尔可夫奖励过程到马尔可夫决策到强化学习【02/2】

一、说明 随着 Open AI 于 2023 年 11 月 6 日发布GPT 代理&#xff0c;我们所有人都对它带来的支持和灵活性着迷。想象一下&#xff0c;有一个个性化的数字助手始终在您身边&#xff0c;根据您的喜好完成日常平凡任务或艰巨任务。但为这些定制代理提供动力的是强化学习&#x…

各大超声波清洗机品牌该如何选?清洁好超声波清洗机推荐

现在越来越多智能家居都将方便快捷作为卖点进行介绍&#xff0c;但确实随着科技变化&#xff0c;现在市面上有非常多的智能家居&#xff0c;像清洗眼镜也不例外&#xff0c;从最开始传统手动清洗眼镜到现在超声波清洗机问世&#xff0c;而市面上也出现了非常多超声波清洗机供大…

【ArcGIS微课1000例】0084:甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)

甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)。 文章目录 一、成果预览二、实验数据三、符号化四、地图整饰一、成果预览 本实验最终效果图如下所示: 二、实验数据 以下数据可以从本专栏配套的实验数据包中0084.rar中获取。 1. 历史灾害数据。为2005-2020时…

ImageNet的故事:李飞飞自传《我所见的世界》中文节选

李飞飞教授的自传《The Worlds I See》&#xff08;我所见的世界&#xff09;英文版11月出版了&#xff0c; 目前还没看到中文版。 此前对李飞飞教授了解并不多&#xff0c;除了知道她是大名鼎鼎的ImageNet发起人&#xff0c;以及斯坦福SAIL人工智能实验室第一位女性主任。这次…

深度学习中氨基酸序列的编码方法

目录 1. 常规特征编码方法1.1 类别特征1.2 文本特征 2. 基于领域先验知识的编码方法2.1 演化关系2.2 理化性质 3. 基于学习的编码方法3.1 预训练模型3.2 端到端方法 参考 随着AI算法创新和算力提升&#xff0c;叠加生物&#xff08;组学&#xff09;数据&#xff08;指数级&…

深度学习|3.6 激活函数 3.7 为什么需要非线性激活函数

激活函数 主要有sigmoid函数、tanh函数、relu函数和leaky relu函数 tanh函数相比sigmoid函数是具有优势的&#xff0c;因为tanh函数使得输出值的平均值为0&#xff0c;而sigmoid函数使得输出值的平均值为1/2&#xff0c;对下一层来说tanh输出的0更好进行处理。 激活函数tanh…

【机器学习】卷积神经网络(三)

四、理论分析 4.1 反卷积运算 我们可以将过滤器转换为 Toeplitz matrix &#xff0c;将图像转换为向量&#xff0c;然后仅通过一个矩阵乘法进行卷积&#xff0c;而不是使用 for-loops 对图像&#xff08;或任何其他 2D 矩阵&#xff09;执行 2D 卷积。 &#xff08;当然还要对乘…

基于YOLOv8的目标跟踪技术

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;介绍了YOLOv8自带的目标跟踪技术以及评价指标&#xff0c;并教会你如何在YOLOv8使用 1.YOLOv8自带两种跟踪方法 ultralytics/cfg/trackers/文件夹下 1.1 ByteTrack介绍 https://arxiv.org/pdf/2110.06864.pdf 摘…

Ubuntu基础之vim编辑器

前言 Vim是一个文本编辑器&#xff0c;通常在Unix和Linux系统上使用。它是Vi编辑器的改进版本&#xff0c;具有更多的功能和定制选项。Vim是一个强大的编辑器&#xff0c;可以通过命令模式和插入模式来编辑文本文件。它也有许多插件和扩展 1. 启动 Vim 在终端中输入以下命令来…

System.out::println是什么 ? Lambda表达式和方法引用

System.out::printlin 可以很好的串联Java8新特性中的Lambda表达式和方法引用 List<Integer> list Arrays.asList(1, 2, 3, 4, 5);//完成对集合元素的遍历输出list.forEach(System.out::println);首先用Lambda体简化匿名内部类了解函数式接口的概念方法引用的用法Consum…

【快速全面掌握 WAMPServer】11.安装 PHP 扩展踩过的坑

网管小贾 / sysadm.cc 我们在调试程序代码时&#xff0c;总会遇到一些 PHP 项目需要某些扩展组件。 而在 WAMPServer 下通常的 PHP 扩展的安装也不算有多麻烦。 具体关于 PHP 扩展的区分&#xff08;比如安全线程或非安全线程&#xff09;&#xff0c;以及怎么安装小伙伴们可…

【Emgu.CV教程】第18篇 、色彩处理之AdaptiveThreshold()自适应阈值化处理

之前学了Threshold()二值化函数&#xff0c;这个是在每一张照片里面&#xff0c;用同一个阈值进行二值化操作&#xff0c;但是对于一些对比度比较大的图片&#xff0c;可能会出现问题。比如这张照片想要提取出黑色文字文字&#xff1a; 如果执行以下代码&#xff1a; CvInvoke…

基于Flutter构建小型新闻App

目录 1. 概述 1.1 功能概述 1.2 技术准备 1.3 源码地址 2. App首页 2.1 pubspec依赖 2.2 热门首页组件 2.2.1 DefaultTabController 2.2.2 Swiper 2.3 新闻API数据访问 2.4 热门首页效果图 3. 新闻分类 3.1 GestureDetector 3.2 新闻分类效果图 4. 收藏功能 4…

详解 MySql InnoDB 的 MVCC 实现机制

目录 一. 前言 二. 认识 MVCC 2.1. 什么是 MVCC&#xff1f; 2.2. 什么是当前读和快照读&#xff1f; 2.3. 当前读、快照读和 MVCC 的关系 2.4. MVCC 能解决什么问题&#xff0c;好处是什么&#xff1f; 2.5. 小结 三. MVCC 的实现原理 3.1. 隐式字段 3.2. undo 日志…

SQL常见面试题

今天刷了一遍牛客里的必知必会题&#xff0c;一共50道题&#xff0c;大部分都比较基础&#xff0c;下面汇总一下易错题。 SQL81 顾客登录名 本题几个关键点&#xff1a; 登录名是其名称和所在城市的组合&#xff0c;因此需要使用substring()和concat()截取和拼接字段。得到登…

SpringBoot解决前后端分离跨域问题:状态码403拒绝访问

最近在写和同学一起做一个前后端分离的项目&#xff0c;今日开始对接口准备进行 登录注册 的时候发现前端在发起请求后&#xff0c;抓包发现后端返回了一个403的错误&#xff0c;解决了很久发现是【跨域问题】&#xff0c;第一次遇到&#xff0c;便作此记录✍ 异常描述 在后端…

前端:html+css+js实现CSDN首页

提前说一下&#xff0c;只实现了部分片段哈&#xff01;如下&#xff1a; 前端&#xff1a;htmlcssjs实现CSDN首页 1. 实现效果2. 需要了解的前端知识3. 固定定位的使用4. js 监听的使用4. 参考代码和运行结果 1. 实现效果 我的实现效果为&#xff1a; 原界面如下,网址为&…

计算机网络(1)

计算机网络&#xff08;1&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 计算机网络和因特网&#xff08;1&#xff09;因特网概念解读服务常见的服务 协议网络边缘特点强调 网络核心特点强调 小程一言 我的计算机网络专栏&#xff0c;是自己在计算机网络…