floodfill算法的几种实现

OpenCV的floodFill(漫水填充)分割 另外需要注意的是,mask会比需填充的图像大,所以mask中与输入图像(x,y)像素点相对应的点的坐标为(x+1,y+1)。参数mask也是输入/输出参数,是第二个版本的floodFill独享的,表示操作掩膜,它应该为单通道、8位、长和宽上都比输入图像image大两个像素点的图像。使用C++重写过的floodFill函数有两个版本,一个是不带mask的版本,另一个是带mask的版本。漫水填充算法的原理很简单,就是从一个点开始遍历附近的像素点,并填充成新的颜色,直到封闭区域内所有像素点都被填充成新颜色为止。 阅读详情

<pre name="code" class="cpp">一、4-Way Recursive Method(FloodFill4)
 
//Recursive 4-way floodfill, crashes if recursion stack is full 
void floodFill4(int x, int y, int newColor, int oldColor) 
{ 
    if(x >= 0 && x < w && y >= 0 && y < h && screenBuffer[x][y] == oldColor && screenBuffer[x][y] != newColor) 
    { 
        screenBuffer[x][y] = newColor; //set color before starting recursion
        
        floodFill4(x + 1, y,     newColor, oldColor);
        floodFill4(x - 1, y,     newColor, oldColor);
        floodFill4(x,     y + 1, newColor, oldColor);
        floodFill4(x,     y - 1, newColor, oldColor);
    }     
}
 
二、8-Way Recursive Method(FloodFill8)
//Recursive 8-way floodfill, crashes if recursion stack is full
void floodFill8(int x, int y, int newColor, int oldColor)
{
    if(x >= 0 && x < w && y >= 0 && y < h && screenBuffer[x][y] == oldColor && screenBuffer[x][y] != newColor)
    {
        screenBuffer[x][y] = newColor; //set color before starting recursion!
        
        floodFill8(x + 1, y,     newColor, oldColor);
        floodFill8(x - 1, y,     newColor, oldColor);
        floodFill8(x,     y + 1, newColor, oldColor);
        floodFill8(x,     y - 1, newColor, oldColor);
        floodFill8(x + 1, y + 1, newColor, oldColor);
        floodFill8(x - 1, y - 1, newColor, oldColor);
        floodFill8(x - 1, y + 1, newColor, oldColor);
        floodFill8(x + 1, y - 1, newColor, oldColor);
    }    
}
三、4-Way Method With Stack(FloodFill4Stack)
//4-way floodfill using our own stack routines
void floodFill4Stack(int x, int y, int newColor, int oldColor)
{
    if(newColor == oldColor) return; //avoid infinite loop
    emptyStack();
      
    if(!push(x, y)) return; 
    while(pop(x, y))
    {
        screenBuffer[x][y] = newColor;
        if(x + 1 < w && screenBuffer[x + 1][y] == oldColor)
        {          
            if(!push(x + 1, y)) return;           
        }    
        if(x - 1 >= 0 && screenBuffer[x - 1][y] == oldColor)
        {
            if(!push(x - 1, y)) return;           
        }    
        if(y + 1 < h && screenBuffer[x][y + 1] == oldColor)
        {
            if(!push(x, y + 1)) return;           
        }    
        if(y - 1 >= 0 && screenBuffer[x][y - 1] == oldColor)
        {
            if(!push(x, y - 1)) return;           
        }    
    }     
}
四、8-Way Method With Stack(FloodFill8Stack)
//4-way floodfill using our own stack routines
void floodFill4Stack(int x, int y, int newColor, int oldColor)
{
    if(newColor == oldColor) return; //avoid infinite loop
    emptyStack();
      
    if(!push(x, y)) return; 
    while(pop(x, y))
    {
        screenBuffer[x][y] = newColor;
        if(x + 1 < w && screenBuffer[x + 1][y] == oldColor)
        {          
            if(!push(x + 1, y)) return;
        }    
        if(x - 1 >= 0 && screenBuffer[x - 1][y] == oldColor)
        {
            if(!push(x - 1, y)) return;
        }    
        if(y + 1 < h && screenBuffer[x][y + 1] == oldColor)
        {
            if(!push(x, y + 1)) return;
        }    
        if(y - 1 >= 0 && screenBuffer[x][y - 1] == oldColor)
        {
            if(!push(x, y - 1)) return;
        }
        if(x + 1 < w && y + 1 < h && screenBuffer[x + 1][y + 1] == oldColor)
        {      
            if(!push(x + 1, y + 1)) return;
        }        
        if(x + 1 < w && y - 1 >= 0 && screenBuffer[x + 1][y - 1] == oldColor)
        {  
            if(!push(x + 1, y - 1)) return;
        } 
        if(x - 1 >= 0 && y + 1 < h && screenBuffer[x - 1][y + 1] == oldColor)
        {          
            if(!push(x - 1, y + 1)) return;
        }
        if(x - 1 >= 0 && y - 1 >= 0 && screenBuffer[x - 1][y - 1] == oldColor)
        {
            if(!push(x - 1, y - 1)) return;
        }
    }
}
五、 Recursive Scanline Floodfill Algorithm(floodFillScanline)
//stack friendly and fast floodfill algorithm
void floodFillScanline(int x, int y, int newColor, int oldColor)
{
    if(oldColor == newColor) return;
    if(screenBuffer[x][y] != oldColor) return;
      
    int y1;
    
    //draw current scanline from start position to the top
    y1 = y;
    while(y1 < h && screenBuffer[x][y1] == oldColor)
    {
        screenBuffer[x][y1] = newColor;
        y1++;
    }    
    
    //draw current scanline from start position to the bottom
    y1 = y - 1;
    while(y1 >= 0 && screenBuffer[x][y1] == oldColor)
    {
        screenBuffer[x][y1] = newColor;
        y1--;
    }
    
    //test for new scanlines to the left
    y1 = y;
    while(y1 < h && screenBuffer[x][y1] == newColor)
    {
        if(x > 0 && screenBuffer[x - 1][y1] == oldColor) 
        {
            floodFillScanline(x - 1, y1, newColor, oldColor);
        } 
        y1++;
    }
    y1 = y - 1;
    while(y1 >= 0 && screenBuffer[x][y1] == newColor)
    {
        if(x > 0 && screenBuffer[x - 1][y1] == oldColor) 
        {
            floodFillScanline(x - 1, y1, newColor, oldColor);
        }
        y1--;
    } 
    
    //test for new scanlines to the right 
    y1 = y;
    while(y1 < h && screenBuffer[x][y1] == newColor)
    {
        if(x < w - 1 && screenBuffer[x + 1][y1] == oldColor) 
        {           
            floodFillScanline(x + 1, y1, newColor, oldColor);
        } 
        y1++;
    }
    y1 = y - 1;
    while(y1 >= 0 && screenBuffer[x][y1] == newColor)
    {
        if(x < w - 1 && screenBuffer[x + 1][y1] == oldColor) 
        {
            floodFillScanline(x + 1, y1, newColor, oldColor);
        }
        y1--;
    }
}
六、Scanline Floodfill Algorithm With Stack(floodFillScanlineStack)
/The scanline floodfill algorithm using our own stack routines, faster
void floodFillScanlineStack(int x, int y, int newColor, int oldColor)
{
    if(oldColor == newColor) return;
    emptyStack();
    
    int y1; 
    bool spanLeft, spanRight;
    
    if(!push(x, y)) return;
    
    while(pop(x, y))
    {    
        y1 = y;
        while(y1 >= 0 && screenBuffer[x][y1] == oldColor) y1--;
        y1++;
        spanLeft = spanRight = 0;
        while(y1 < h && screenBuffer[x][y1] == oldColor )
        {
            screenBuffer[x][y1] = newColor;
            if(!spanLeft && x > 0 && screenBuffer[x - 1][y1] == oldColor) 
            {
                if(!push(x - 1, y1)) return;
                spanLeft = 1;
            }
            else if(spanLeft && x > 0 && screenBuffer[x - 1][y1] != oldColor)
            {
                spanLeft = 0;
            }
            if(!spanRight && x < w - 1 && screenBuffer[x + 1][y1] == oldColor) 
            {
                if(!push(x + 1, y1)) return;
                spanRight = 1;
            }
            else if(spanRight && x < w - 1 && screenBuffer[x + 1][y1] != oldColor)
            {
                spanRight = 0;
            } 
            y1++;
        }
    }
}
cc
 
bool pop(int
&x, int &y) 
{ 
    if(stackPointer > 0) 
    { 
        int p = stack[stackPointer]; 
        x = p / h; 
        y = p % h; 
        stackPointer--; 
        return 1; 
    }     
    else 
    { 
        return 0; 
    }    
}    

bool push(int x, int y) 
{ 
    if(stackPointer < stackSize - 1) 
    { 
        stackPointer++; 
        stack[stackPointer] = h * x + y; 
        return 1; 
    }     
    else 
    { 
        return 0; 
    }    
}     

void emptyStack() 
{ 
    int x, y; 
    while(pop(x, y)); 
}
void clearScreenBuffer(ColorRGB color) 
{ 
    for(int x = 0; x < w; x++) 
    for(int y = 0; y < h; y++) 
    { 
        screenBuffer[x][y] = RGBtoINT(color); 
    }     
}





        
FloodFill算法详解及应用 FloodFill算法详解及应用 啥是 FloodFill 算法呢, 最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中 那个小油漆桶的标志,可以把一块被圈起来的区域全部染色。 这种算法思想还在许多其他地方有应用。比如说扫雷游戏,有时候你点一个方格, 会一下子展开一片区域,这个展开过程,就是 FloodFill 算法实现的。 类似的,像消消乐这类游戏,相同方块积累到一定数量,就全... 阅读详情

相关推荐

matlab开发-floodfillscanline

matlab开发-floodfillscanline。在matlab中使用洪泛填充或绘制桶工具,如imfill、scanline算法和动画。

floodfill算法

From: http://hi.baidu.com/qteqpid_pku/blog/item/fcb366eeeb0d182f2cf53464.html + From wikipedia Flood fill, also called seed fill, is an algorithm that determines the area connected to a give

行风 7847

种子染色法FloodFill

Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名。在GNU Go和扫雷中,Flood Fill算法被用来计算需要被清除的区域。

OpenCV漫水填充

漫水填充就是用一定颜色填充联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果;漫水填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。种子填充算法是从多边形区域内部的一点开始,由此出发找到区域内的所有像素。它采用的边界定义是区域边界上所有像素具有某个特定的颜色值,区域内部所有像素均不取这一特定颜色,而边界外的像素则可具有与边界相同的颜色值。而扫描线种子填充算法属于种子

松子茶的专栏 6981

Flood_Fill算法

Flood_Fill算法介绍与实现 相当详细 绝对相当有用!!

Labview及NI-USRP驱动安装教程

软件下载 安装使用的LabVIEW2018及NI-USRP驱动程序已上传,下载地址: 天翼云盘链接 (访问码:oc33) 百度网盘链接 (提取码:88mi) (注:天翼云盘下载不限速) LabVIEW2018安装步骤 右键软件压缩包选择解压至LabVIEW2018 选中文件,鼠标右击选择以管理员身份打开2018LV-WinChn.exe文件。 点击确定。 点击Unzip解压。 点击确定。 点击下一步。 填写任意信息后,点击下一步。 点击下一步。 点击浏览更改安装路径建议安装到除C盘以

dadapongi6的博客 2万+

图像处理------泛洪填充算法(Flood Fill Algorithm) 油漆桶功能

泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows paint的油漆桶功能。算法的原理很简单,就是从一个点开始附近像素点,填充成新 的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。泛红填充实现最常见有四邻域 像素填充法,八邻域像素填充法,基于扫描...

weixin_34235371的博客 2029

如何设计QR反激变换器

摘要:本文分析了基于GaN技术的PD适配器市场现状,重点探讨了准谐振反激变换器(QR Flyback)的工作原理及设计方法。文章首先介绍了反激变换器的三种工作模式(CCM、DCM、CRM/QR)及其特点,指出QR模式通过谷底开通技术能显著降低开关损耗。随后以65W适配器为例,详细阐述了变压器参数设计流程,包括匝比确定、原边电感计算和绕组匝数设计等关键步骤。文章强调QR反激变换器凭借高效率、小体积和低成本优势,已成为20W-65W PD适配器的主流拓扑方案,配合GaN技术进一步提升了功率密度和便携性。

m0_62868254的博客 1496

图像处理之泛洪填充算法(Flood Fill Algorithm)

泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows paint的油漆桶功能。算法的原理很简单,就是从一个点开始附近像素点,填充成新 的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。泛红填充实现最常见有四邻域 像素填充法,八邻域像素填充法,基于扫描线的像素填充方...

weixin_33726318的博客 1787

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 460

【车载以太网】【SOMEIP】Wireshark测试someip

一、 Wireshark SOMEIP plugin 1.1 插件安装 Wireshark插件目录:Help -> About Wireshark -> Folders/Pluginshttps://github.com/jamores/eth-ws-someip 解压后,将所有后缀是lua的文件拷贝到Wireshark安装目录plugins/2.4.10/下。 1.2时间戳调整为UTC显示格式 View -> Time Display Format -> Date and Tim.

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 9723

泛洪填充算法(Flood Fill Algorithm)

泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows paint的油漆桶功能。算法的原理很简单,就是从一个点开始附近像素点,填充成新 的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。泛红填充实现最常见有四邻域 像素填充法,八邻域像素填充法,基于扫描线的像素填充方法。根据实现又可以分为递归与 非递归(基于栈)。  

qq_35124535的博客 3037

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2569

第三章 搜索(1):BFS

目录1、Flood Fill(洪水覆盖/填充算法)1.1 池塘计数1.2 城堡问题1.3 山峰和山谷2、最短路模型(所有边权值相同的图)2.1 走迷宫2.1.1 游戏2.2 迷宫问题 (记录方案)2.3 图中点的层次2.4 武士风度的牛2.5 抓住那头牛2.7 地铁修建(BFS + 二分)3、多源BFS3.1 矩阵距离4、最小步数模型4.1 八数码4.2 玛雅人的密码4.3 魔板5、双端队列广搜5.1 电路维修6、双向广搜 (一般用于优化最小步数模型)6.1 字串变换7、A* (一般用于优化最小步数模型)7

lumoumou`s blogs 505

内存越界一定会导致程序崩溃吗?详解内存越界

本文详细解释了内存越界不一定导致内存越界的问题,全面介绍了C++内存越界的相关内容。

dvlinker的技术专栏 2万+

SFT看这一篇就够了!万字长文:监督微调(Supervised Fine-Tuning, SFT)技术全解析【从理论到实战】

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。欢迎关注,一起探索技术的无限可能!

大F子的智能小课 711

BFS:Floodfill算法

Floodfill,翻译为洪水灌溉,而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。

weixin_51142926的博客 4074

Vue - 详细完美解决 ElementUI MessageBox “多次“ 弹框问题,让其无论执行多少次都只弹出来一次(常见于请求拦截器多次触发弹框,导致弹出来很多个)详细示例代码,保证完美解决!

vue如何防止ElementUIMessageBox多次弹框,vueelement弹框弹出来很多次怎么办,elementvueMessageBox解决执行多次后出现多次弹框的问题,elementUI如何阻止MessageBox多次弹出来,vue+element解决多个请求同时报错,弹出多个消息框message,饿了么组件库MessageBox弹框频繁弹出解决方法,vue调用MessageBox出现多次弹框,vueelementMessageBox怎么只弹出一次,vue之axios请求

🏆 前端领域优质创作者 8194

DFS:floodfill算法解决矩阵联通块问题

floodfill,翻译为洪水灌溉,而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。

weixin_51142926的博客 3262

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

FloodFill算法---DFS

floodfill算法是一种图像处理算法,用于填充连通区域。它的作用是将指定的像素点及其相邻的相同颜色的像素点都填充为指定的颜色,从而形成一个封闭的区域。 该算法常用于图像编辑软件中的涂色功能,也可以用于图像分割、边缘检测等应用。通过floodfill算法,可以快速、自动地填充图像中的特定区域,提高图像处理的效率和准确性。 floodfill算法的基本思想是通过递归或者栈来实现。 本文章详细介绍了floodfill算法的基本用法及模板,通过经典例题帮助友友快速掌握,希望可以帮到您。

2301_80035594的博客 2870

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

算法【Java】—— FloodFill 算法

使用Java 语言介绍 FloodFill 算法

熵减玩家 2090

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

BFS:FloodFill算法

Flood Fill算法是一种用于确定与某个给定节点相连的区域的算法,常用于计算机图形学和图像处理。该算法可以用于诸如填充多边形、检测连通区域等任务。Flood Fill算法有多种实现方式,其中最常见的是递归方法和使用栈或队列的迭代方法。基本思想Flood Fill算法从一个初始像素开始,检查该像素的颜色。如果颜色匹配(即需要填充的颜色),则将其填充为新的颜色,然后对相邻的像素重复这一过程,直到所有相连的匹配像素都被填充为止。

2301_79969994的博客 1966

专题四:FloodFill 算法

作者:დ旧言~> 座右铭:松树千年终是朽,槿花一日自为荣。> 目标:了解什么是FloodFill 算法,并且FloodFill 算法。> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!

AAlykk的博客 1264

【算法专题】FloodFill 算法

算法专题之 FloodFill 算法,七道题拿捏FloodFill算法!

YoungMLet的博客 2636

FloodFill算法——DFS

FloodFill算法就是用来寻找性质相同的连通快的算法,这篇博客都是用dfs来实现FloodFill算法。

2302_80826557的博客 993

【基础算法总结】BFS 解决 FloodFill 算法

【基础算法总结】BFS 解决 FloodFill 算法

fight_p的博客 2369
上一篇: c++中容器的基本使用
下一篇: uva 11134 Fabled Rooks
purevegetable
博客等级 码龄14年 24粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值