首页 > 编程语言 >OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)

OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)

时间:2022-12-01 10:07:15浏览次数:43  
标签:填充 cv2 floodfill OpenCV 源码 im 漫水 二值


重磅干货,第一时间送达

OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)_深度学习

导读

本文主要介绍使用OpenCV对二值图做孔洞填充的方法与实现。

背景介绍

为什么要做孔洞填充?因为在部分情况下,二值图内部的孔洞和外部轮廓是一个整体,填充孔洞可以方便后续处理,减少干扰。

OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)_c++_02

OpenCV孔洞填充的常用方法有2种:

① 形态学闭运算。闭运算是先膨胀后腐蚀操作,如上图,先膨胀白色高亮区域增加,孔洞会被填充。但使用闭运算针对不同的图片不能准确知道需要的核大小是多少,所以并不能通用;

② 轮廓绘制方法。通过轮廓绘制drawContours函数设置绘制线宽为-1即可填充绘制。但查找轮廓一般是在二值图处理之后才会使用,这样会造成重复操作。

尽量在二值图时完成孔洞填充,不影响后续操作顺序才是最终目标!

实现步骤与代码

实现步骤:

① 通过二值化或其他方法得到二值图;

② 使用floodFill从(0,0)点开始执行漫水填充算法;

③ 漫水填充结果图取反;

④ 取反后的结果与二值图求并集。

实现代码与逐步演示:

OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)_c++_03

① 得到二值图:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thres = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)
cv2.imshow("thres", thres)

OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)_c++_04

② 执行漫水填充算法:

#执行漫水填充方法.
#注意图像大小比原图宽高都大2.
h, w = gray.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)


#漫水填充从(0, 0)点开始
cv2.floodFill(im_floodfill, mask, (0,0), 255)
cv2.imshow("im_floodfill", im_floodfill)

OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)_c++_05

③ 漫水填充图像取反:

#反转漫水填充图像
im_floodfill_inv = cv2.bitwise_not(im_floodfill)
cv2.imshow("im_floodfill_inv", im_floodfill_inv)


OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)_并集_06

④ 取反图像与二值图求并集:

#将二值图与上一步图像求并集
im_out = thres | im_floodfill_inv
cv2.imshow("holeFill", im_out


OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)_并集_07

换张图片测试同样可以,此方法具有通用性,可自己封装成函数使用。

OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)_深度学习_08

参考链接:https://learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/



后台回复:OpenCV145

即可获取145个OpenCV实例应用代码(Python/C++双语言实现)

更多视觉图像处理相关内容,请长按关注:OpenCV与AI深度学习。


觉得有用,麻烦给个赞


标签:填充,cv2,floodfill,OpenCV,源码,im,漫水,二值
From: https://blog.51cto.com/stq054188/5901159

相关文章

  • (附代码)树莓派利用OpenCV的图像跟踪、人脸识别等
    编者荐语 树莓派(RaspberryPi)是各种派中最早开始流行起来的一个嵌入式Linux板卡,其本质是尺寸仅有信用卡大小的一个小型电脑。你可以将树莓派连接电视、显示器、键盘鼠标等......
  • 实战 | OpenCV+OCR实现环形文字识别实例(详细步骤 + 代码)
    导读本文将介绍使用OpenCV+OCR实现环形文字识别的详细步骤和代码演示。(来源公众号:OpenCV与AI深度学习) 背景介绍  光学字符识别(OCR)场景中有很多特殊情况,比如噪声、......
  • top源码可编译版
    循环打印当前系统的进程状态信息/**Copyright(c)2008,TheAndroidOpenSourceProject*Allrightsreserved.**Redistributionanduseinsourceandbin......
  • JUC源码学习笔记6——ReentrantReadWriteLock
    系列文章目录和关于我阅读此文需要有AQS独占和AQS共享的源码功底,推荐阅读:1.JUC源码学习笔记1——AQS独占模式和ReentrantLock2.JUC源码学习笔记2——AQS共享和Semaphore......
  • Caffeine 源码、架构、原理(史上最全,10W超级字长文)
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • drupal源码分析
    说实在的,drupal确实很复杂,在国内用的人也不多,唯一看的懂的中文技术网站估计就是drupalchina.org了,但是对于源代码的分析是少之又少.没有办法,只能自己来从头看起了!越......
  • OpenCV+yolov2-tiny实现目标检测(C++)
    OpenCV+yolov2-tiny实现目标检测(C++)  目标检测算法主要分为两类:一类是基于RegionProposal(候选区域)的算法,如R-CNN系算法(R-CNN,FastR-CNN,FasterR-CNN),它们是two-stag......
  • RocketMQ系列-搭建Namesrv源码调试环境
    RocketMQ系列-搭建Namesrv源码调试环境在学习任何一个技术框架的时候,我们通常都是先了解是什么,有什么作用、解决什么问题、设计亮点和设计思想是什么;当然对于技术学习上来......
  • Qt+OpenCV2视频等操作时,运行越久越卡的情况
    Qt应用开发总结OpenCV2使用摄像头读取数据流进行目标检测等操作时,运行越久越卡的情况因为在循环中不断读取每一帧的图片数据进行相应的如复制、灰度等一些操作时,在堆上开......
  • MySQL源码编译安装
    MySQL源码编译安装Linux环境:CentOS7.6MySQL版本:MySQL5.7.37安装路径:/usr/local/mysql1.创建相关目录#创建用户useradd-s/sbin/nologinmysql#创建安装目录并......