matlab中的imfill函数可以方便得实现二值图像的孔洞填充,而在opencv中并没有相同功能的函数。因此,在opencv的基础上编写实现孔洞填充的函数,并且能够设定阈值,对面积大于阈值的孔洞不进行填充。使用形态学重建的算法能够有效地实现孔洞填充,具体算法参照《数字图像处理》第三版9.5.9节,孔洞填充。

主要实现代码如下所示:其中imfill函数即为空洞填充的实现函数,第一个参数是二值图像(0~1),第二个参数是填充孔洞的阈值。若孔洞面积大于阈值则不填充,反之则填充。

#include "iostream"
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
Mat inv_board(Mat src);
Mat inv_img(Mat src);
void delarea(Mat& bw, int max);
Mat imfill(Mat I, int max);
void main()
{Mat scr = imread("2.png");Mat I, src_gray, F_B, F_BI_C, temp, H, I_fill;cvtColor(scr, src_gray, COLOR_BGR2GRAY);threshold(src_gray, I, 0.1, 1,0);I_fill = imfill(I,40);imshow("原二值图", I * 255);imshow("填充图", I_fill*255);waitKey(0);
}Mat imfill(Mat I,int max)
{Mat  src_gray, F_B, F_BI_C, temp, H, I_fill;I_fill = I.clone();Mat F = inv_board(I);Mat I_C = inv_img(I);Mat element = getStructuringElement(0, Size(3, 3), Point(1, 1));while (1){dilate(F, F_B, element);F_BI_C = F_B.mul(I_C);temp = F_BI_C - F;if (sum(temp) == Scalar(0))break;elseF = F_BI_C.clone();}H = inv_img(F_BI_C);Mat H_IC = H.mul(I_C);delarea(H_IC, max);for (int i = 0; i < H_IC.rows; i++){for (int j = 0; j < H_IC.cols; j++){if (H_IC.at<uchar>(i, j) == 1)I_fill.at<uchar>(i, j) = 1;}}return I_fill;
}
Mat inv_board(Mat src)
{int rows = src.rows;int cols = src.cols;Mat dst = Mat::zeros(rows, cols, CV_8UC1);for (int i = 0; i < cols; i++){dst.at<uchar>(0, i) = 1 - src.at<uchar>(0, i);}for (int i = 0; i < cols; i++){dst.at<uchar>(rows-1, i) = 1 - src.at<uchar>(rows - 1, i);}for (int i = 1; i < rows-1; i++){dst.at<uchar>(i, 0) = 1 - src.at<uchar>(i, 0);}for (int i = 1; i < rows - 1; i++){dst.at<uchar>(i, cols-1) = 1 - src.at<uchar>(i, cols-1);}return dst;
}Mat inv_img(Mat src)
{int rows = src.rows;int cols = src.cols;Mat dst = src.clone();for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)dst.at<uchar>(i, j) = 1 - src.at<uchar>(i, j);return dst;
}void delarea(Mat& bw, int max )
{Mat bw_copy = bw.clone();int flag = 0; Mat H_b, H_bw, temp;Mat H = Mat::zeros(bw.size(), bw.type());for (int i = 0; i < bw.rows; i++){for (int j = 0; j < bw.cols; j++){if (bw_copy.at<uchar>(i, j) == 1){H.at<uchar>(i, j) = 1;Mat element = getStructuringElement(0, Size(3, 3), Point(1, 1));while (1){dilate(H, H_b, element); H_bw = H_b.mul(bw);temp = H_bw - H;if (sum(temp) == Scalar(0))break;elseH = H_bw.clone();}bw_copy = bw_copy - H_bw;if (sum(H_bw).val[0] > max){bw = bw - H_bw;}H = Mat::zeros(bw.size(), bw.type());}}}
}

opencv实现二值图像孔洞填充相关推荐

  1. matlab 实现二值图像孔洞填充函数imfill()

    代码如下: function [I2,locations] = imfill(varargin)[I,locations,conn,do_fillholes] = parse_inputs(varar ...

  2. OTSU阈值分割+孔洞填充+海陆分离

    1. OTSU阈值分割 参考1. https://zhuanlan.zhihu.com/p/124944108 OTSU算法(大津算法)的详细步骤: 假设初始有个阈值 T 0 T_0 T0​,并将图像 ...

  3. OpenCV函数应用:基于二值图像的三种孔洞填充方法记录(附python,C++代码)

    系列文章目录 函数系列: OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形 ...

  4. opencv 二值图像的孔洞填充

    有的时候,我们需要对图像进行孔洞填充,一般想到的方法都是,使用findcontours函数,查找最外层轮廓,然后画出找到的轮廓. 这确实是一种方法,但似乎不够高效.下面贴出一个函数,可以更好的实现这个 ...

  5. 【youcans 的 OpenCV 例程200篇】123. 形态算法之孔洞填充

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...

  6. 【youcans 的 OpenCV 例程200篇】132. 形态学重建之孔洞填充算法

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...

  7. OpenCV图象孔洞内轮廓填充

    图像内轮廓填充通常称为孔洞填充,主要用于目标提取.不带任何条件的内轮廓填充,在目标密度很大时,可能导致错误填充.一种典型情况,当多个目标粘连,并 且形成环状时,简单的内轮廓填充会将环状内部背景部分误认 ...

  8. Python-基于OpenCV的轮廓填充 泛洪算法 孔洞填充

    左为原图 右为填充后 针对轮廓填充,我们先要提取图像中的轮廓,在对里面的进行颜色填充,这个我自己也有点分不清楚,他和阈值分割进行填充有什么区别,要是有大佬知道,分享一下,将感激不尽!轮廓填充的方法常用 ...

  9. OpenCV技巧 | 二值图孔洞填充方法与实现(附Python/C++源码)

    点击上方"OpenCV与AI深度学习",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 本文主要介绍使用OpenCV对二值图做孔洞填 ...

最新文章

  1. 细鹏系列裸金属服务器多核算力,鲲鹏凌云,开启多元计算新架构_外发版(40页)-原创力文档...
  2. mongoose 使用总结
  3. Logstash 参考指南(使用Filebeat Modules配置示例)
  4. mysql b-a全局索引_MySQL中B+树索引的使用
  5. ASP.NET中TextBox控件的AutoCompleteType属性(不保存历史输入记录)
  6. php jquery 源码,最新版jQuery 2.1.0完整
  7. RabbitMQ——路由模式
  8. HDU1259 ZJUTACM【模拟】
  9. JAVA 大数运算模板 ACM竞赛必备
  10. import keras的错误module ‘tensorflow.compat.v2‘ has no attribute ‘__internal__‘
  11. phpstudy所需的vc11和vc14运行库
  12. dev万能头文件_超级好用的C++万能头文件
  13. 大学生爱情兵法-洪亚非-听课笔记
  14. OLED取模-PS做图转字模提取软件
  15. 光纤带光缆的特点及应用场景
  16. redmine backlogs的tracker使用
  17. [Err] 1418 - This function has none of DETERMINIST
  18. 计算机电源选平衡,电脑里选择电源计划哪个好
  19. hin2vec 异质信息网络表示学习 个人笔记
  20. 飞思卡尔XS128系列(三) PIT

热门文章

  1. Matlab图论工具箱的命令
  2. fastadmin 的自定义搜索select框联动
  3. [春秋云镜]CVE-2020-19960,CVE-2020-19961
  4. 微信公众号掉粉原因分析,公众号运营者请对照排查
  5. CAD图转成Protel封装
  6. 蓝桥杯Java——基础练习VIP
  7. Navbar:导航栏
  8. WireShark利用telnet分析指定数据包信息
  9. 招募法师盗贼开箱游戏java,法师和盗贼经常用的宏
  10. $$enhancerBySpringCGLIB$$空指针异常