C++ Opencv imfill 孔洞填充函数的实现
敬告
本文所述内容已经更新,大可不必继续阅读,更新后内容请点击以下链接
点我
函数实现的中心思想
二值图
此程序针对于二值图,寻找二值图中 像素值为0的连通域,将所有连通域的像素点分别保存下来,将符合条件的连通域的像素值 置为255;
寻找连通域的关键
针对填洞功能的实现,也就是0置为255过程,我们需要以四连通为基本点进行寻找。
种子点的确定
寻找种子点,其实就是寻找二值图中像素值为0的点,我们可以直接采取 遍历 二值图 中的像素,将第一个遇见的像素值为0的点确定为 第一个连通域的种子点。这时候,有一些朋友可能会疑惑,因为按照我的说法,在遍历 的过程中,遇见的第n个像素值为0的点 就是第n个连通域的种子点,进一步说,在整个遍历过程中,遇见像素值为0的像素点的个数,就是连通域的个数。
是的!
当然,如果要实现这一点,那我们就需要在各个连通域的寻找的过程中,将找到的点全部立即置为255,(此处不一定非得是255,只要不是0即可)这样在寻找结束后,我们再遍历二值图时,已经找到的连通域中的所有像素点的值均为255,当再次找到像素值为0 的像素点时,此像素点必是下一个待寻找的连通域的种子点
连通域的寻找过程
首先创建四连通的向量,vector<Point> upp;
用来存储上下前后四个点,
创建vector<vector<vector<Point>>> lenm;
用来存储所有的连通域,至于为什么要创建三维Point
数组,大家可以先看看关于这个三维数组的注释,(下面的公式就是,程序中也有相应的注释),了解清楚每一维代表的意义,再结合一下程序,我感觉大家应该可以明白,再简要赘述一下,lenm.size()
为连通域的个数。
如图所示;函数为第i个连通域像素点个数的求和。