0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文解析OpenCV中泛洪填充算法与应用

新机器视觉 来源:OpenCV学堂公众号 作者:OpenCV学堂公众号 2021-04-09 10:25 次阅读

泛洪填充(Flood Fill)很多时候国内的开发者称它为漫水填充,该算法在图形填充与着色应用程序比较常见,属于标配。在图像处理里对二值图像的Hole可以通过泛洪填充来消除,这个是泛洪填充在图像处理中很经典的一个用途,此外还可以通过泛洪填充为ROI区域着色。这个在图像处理也经常用到。让我们首先看一下泛洪填充算法本身,然后再说一下在图像处理中的应用场景。

泛洪填充算法

通常泛洪填充需要从一个点开始,这个点可以随机选择的一点,但是一定要在填充区域内部,然后它就会进行四邻域或者把邻域寻找对周围像素完成填充,直到遇到跟指定随机点像素值不同的像素为止,也可以认为是到达了区域边界。通过邻域像素寻找实现填充速度比较慢、不是泛洪填充好的实现方式,最常见与快速的泛红实现是基于扫描线算法的,步骤如下:

1.首先从开始点出发进行垂直方向列的扫描,填充

2.然后以填充点开始进行每一行的扫描与填充

3.继续以每一行新填充的像素为开始点,执行1,2步骤

4.直到区域所有点都完成填充为止。

图示如下:

第一步:假设有图像如下,红色表种子像素点。

482a1852-98d9-11eb-8b86-12bb97331649.png

首先进行竖直方向的扫描,填充结果如下:

484920ee-98d9-11eb-8b86-12bb97331649.png

然后以填充的红色像素为起始点,开始水平方向的扫描填充,结果如下:

4865be3e-98d9-11eb-8b86-12bb97331649.png

用水平方向被填充像素点为种子像素点,继续竖直方式扫描填充,结果如下:

48739b12-98d9-11eb-8b86-12bb97331649.png

以填充的像素点为种子像素点继续水平方向扫描,结果如下:

488483e6-98d9-11eb-8b86-12bb97331649.png

这样就完成了对整个区域的填充。从上面的例子可以看出,泛洪填充可以通过递归方式编码实现,但是基于递归方式编码实现有个致命的缺点,对大图填充时候容易导致栈溢出,所以更常用的基于队列或者栈的数据结构实现非递归的泛洪填充。OpenCV中的实现主要是基于栈的扫描线算法实现泛洪填充。

应用场景一:

通过泛洪填充算法实现对二值图像对象区域中Hole填充

运行显示原图如下:

489fade2-98d9-11eb-8b86-12bb97331649.png

填充以后结果如下:

48b3b8be-98d9-11eb-8b86-12bb97331649.png

实现代码如下:

48cb96d2-98d9-11eb-8b86-12bb97331649.jpg

应用场景二:

通过泛洪填充实现对ROI区域的着色, 跟上个例子使用API唯一不同地方是带了mask参数。运行结果如下:

48f93bb4-98d9-11eb-8b86-12bb97331649.png

实现代码如下:

4934b072-98d9-11eb-8b86-12bb97331649.jpg

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    1383

    浏览量

    60992
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40786
  • 泛洪算法
    +关注

    关注

    0

    文章

    2

    浏览量

    1296

原文标题:OpenCV中泛洪填充算法解析与应用

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    填充宽度对于精确的焊盘填充过大的影响

    填充宽度是指在焊接过程中,焊盘与焊芯之间的间隔。填充宽度的大小直接影响到焊接质量、焊接强度和焊接过程的稳定性等方面。填充宽度过大可能会导致诸多问题,本文将从焊接质量、焊接强度和焊接过程的稳定性三个
    的头像 发表于 12-26 17:15 1367次阅读

    OpenCV边缘模板匹配算法原理详解

    OpenCV中自带的模板匹配算法,完全是像素基本的模板匹配,特别容易受到光照影响,光照稍微有所不同,该方法就会歇菜了!搞得很多OpenCV初学者刚学习到该方法时候很开心,一用该方法马上很伤心
    的头像 发表于 12-07 10:56 475次阅读
    <b class='flag-5'>OpenCV</b>边缘模板匹配<b class='flag-5'>算法</b>原理详解

    openCV的库自带了模板匹配算法吗?

    openCV的库自带了模板匹配算法
    发表于 10-10 06:48

    关于BM_OPENCV相关问题

    upsample的做法没有标准强制统,jpeg-turbo提供了默认Fancy upsample,也提供了快速复制上采样的算法,原生opencv采用默认的fancy upsample;而BM168x
    发表于 09-19 07:28

    OpenCV的BGR格式,在libyuv对应的那个格式?OpenCV的RGB格式呢?

    OpenCV的BGR格式,在libyuv对应的那个格式?OpenCV的RGB格式呢?
    发表于 09-19 06:00

    无法在OpenVINO trade Docker运行OpenCV怎么解决?

    /dev/dri:/dev/dri \\ -v /docker-share/public:/public \\ openvino/ubuntu20_dev:latest 使用包含 OpenCV
    发表于 08-15 08:29

    opencv_videoio_ffmpeg_64.dll缺失,无法在OpenVINO trade配置OpenCV怎么处理?

    ] global C:\\jenkins\\workspace\\OpenCV\\OpenVINO\\2021.4\\build\\windows\\opencv\\modules\\videoio
    发表于 08-15 08:24

    使用OpenVINO包含的OpenCV时无法导入ArUco库如何解决?

    使用OpenVINO™包含的 OpenCV。 导入了搭载 Python 的 ArUco 库。 收到错误:ModuleNotFoundError: No module named \'cv2.aruco\'
    发表于 08-15 07:30

    【Milk-V Duo 开发板免费体验】OpenCV的交叉编译

    ://community.milkv.io/t/opencv-4-5-4/82),发现编译器生成的程序INTERP段中指定的程序解析器(/lib/ld-musl-riscv64xthead.so.1)在开发板上不存在
    发表于 07-28 20:06

    底部填充胶什么牌子好?底部填充胶国内有哪些厂家?

    近几年,我国的科技发现迅速,为了迎合电子市场的需求,市场上涌现出了一批底部填充胶厂家,面对这林林总总的底部填充胶厂家,我们该如何选择呢?底部填充胶什么牌子好?底部填充胶国内有哪些厂家?
    的头像 发表于 06-28 14:53 1343次阅读
    底部<b class='flag-5'>填充</b>胶什么牌子好?底部<b class='flag-5'>填充</b>胶国内有哪些厂家?

    [译]在RISC-V CPU上运行OpenCV

    RISC-V是个相对较新的平台,在物联网市场中越来越受欢迎。2020年,OpenCV开始支持该平台。 有效执行各种图像处理、计算机视觉和机器学习算法需要矢量/SIMD指令,许多现代CPU架构都提供
    发表于 06-22 18:54

    滑动杆怎么让它从中间开始填充(零在中间),负数往左填充,整数往右填充 零在中间,,负数往左填充,正数往右填充

    ![1(TM@~)CHC80@V}Q3P%`2.jpg 滑动杆怎么让它从中间开始填充(零在中间),负数往左填充,整数往右填充 零在中间,,负数往左填充,正数往右
    发表于 06-12 16:21

    SM3密码算法算法逻辑及要点

    数据填充:SM3算法要求将输入数据填充为512比特的整数倍。填充方法是在数据末尾添加一个1和一些0,使得填充后的长度为512比特的整数倍。
    的头像 发表于 05-22 14:49 1451次阅读

    CMake在Linux 6.1.1-1.0.0搜索包opencv损坏了吗?

    我有个 cmake 项目,使用以下 CMake 语句从 Yocto Linux SDK 导入 OpenCV 库: find_package (需要OpenCV ) 在
    发表于 05-09 11:32

    Yuzuki Lizard 全志V851S开发板 –编译 OPENCV 4.5.4

    ,设定) 到此编译成功 6、编译出来的文件 动态库文件 /usr/local/lib/ 文件库 /usr/local/include/opencv4/ 注意下面步骤成功编译出来的固件,是不含动态库
    发表于 05-08 09:22