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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)相关的知识,希望对你有一定的参考价值。


重磅干货,第一时间送达

OpenCV技巧

导读

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

背景介绍

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

OpenCV技巧

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

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

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

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

实现步骤与代码

实现步骤:

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

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

③ 漫水填充结果图取反;

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

实现代码与逐步演示:

OpenCV技巧

① 得到二值图:

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

OpenCV技巧

② 执行漫水填充算法:

#执行漫水填充方法.
#注意图像大小比原图宽高都大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技巧

③ 漫水填充图像取反:

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


OpenCV技巧

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

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


OpenCV技巧

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

OpenCV技巧

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



后台回复:OpenCV145

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

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


觉得有用,麻烦给个赞


以上是关于OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

S0.4 二值图与阈值化

opencv统计二值图黑白像素个数

图像处理--OpenCV实现图像加噪与滤波

基于OpenCV实现二值图细化,骨骼化并求出端点和交叉点

opencv python 孔洞填充算法

OpenCV二值图求最大连通区域算法(广度优先算法 BFS)