opencv形态学中的孔洞填充详细图解

目录
  • 1. 原理
  • 2. 漫水填充算法

1. 原理

孔洞指的是被前景像素点或者说感兴趣的像素点包围起来的区域,这个区域是我们不感兴趣的背景区域。

数字图像处理的孔洞填充的公式为:

I 为前景像素 ,c 为补集

其实孔洞填充的步骤就是一个迭代的过程:

先设置一个填充的起始点,需要在孔洞的内部。如d图所示,然后被结构元B(图c)膨胀。

然后,为了将膨胀的结果限制在孔洞内部,需要和原图(图a)的补集(图b)相交(图e),因为如果不控制膨胀的结果的话,那么膨胀会填充整个区域,而膨胀结果和原图的补集相交,会使结果限制到我们感兴趣的区域内部,也就是孔洞。

其次,重复这个过程,直到第k步和第k+1的步骤结果相同,那么我们可以认为孔洞已经被填充完毕(图h)

最后,和原图相加即可(图i)

2. 漫水填充算法

注:这里的mask必须为图像长宽+2,且类型要是uint8

我们对下面图像做孔洞填充

# -*- coding: utf-8 -*-
import cv2
import numpy as np
def holefill(img):
    img_copy = img.copy()
    mask = np.zeros((img.shape[0]+2,img.shape[1]+2),dtype=np.uint8)
    cv2.floodFill(img,mask,(0,0),255)
    img_inverse = cv2.bitwise_not(img)
    dst = cv2.bitwise_or(img_copy,img_inverse)
    return dst
img = cv2.imread('hole.png',0)
thresh , img = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
img_copy =img.copy()
dst = holefill(img)
cv2.imshow('img',np.hstack((img_copy,dst)))
cv2.waitKey()
cv2.destroyAllWindows()

处理的结果为

代码详解:

1. 首先将图像进行二值化处理,转为二值图像

2. 通过图像的长和宽设置掩膜mask,类型为uint8

3. floodFill 会对原图像进行操作,所以事先需要拷贝图像,将漫水的种子设为(0,0)也就是图像的左上角,填充的颜色为255。虽然通过计算找到孔洞的位置,然后直接填充就可以,但是这样比较麻烦,且孔洞较多的时候不好处理。这里我们将除了 前景像素点和孔洞 的位置都填充为前景像素点,然后通过求反就可以得到所有的孔洞的位置

4. 最后将孔洞和原图相加即可

到此这篇关于opencv形态学中的孔洞填充详细图解的文章就介绍到这了,更多相关opencv孔洞填充内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV-Python实现通用形态学函数

    通用形态学函数 上篇博文,我们介绍了形态学的基础腐蚀与膨胀操作,而将腐蚀与膨胀结合起来进行组合,我们就能实现开运算,闭运算等复杂的形态学运算. 在OpenCV中,它给我们提供的通用形态学函数为cv2.morphologyEx(),其完整定义如下: def morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None): 这些参数基本前面都介绍过,不过有

  • Python+OpenCV之形态学操作详解

    目录 一. 腐蚀与膨胀 1.1 腐蚀操作 1.2 膨胀操作 二. 开运算与闭运算 2.1 开运算 2.2 闭运算 三.梯度运算 四.礼帽与黑帽 4.1 礼帽 4.2 黑帽 一. 腐蚀与膨胀 1.1 腐蚀操作 import cv2 import numpy as np img = cv2.imread('DataPreprocessing/img/dige.png') cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows(

  • Python OpenCV学习之图像形态学

    目录 背景 一.图像二值化 二.自适应阈值 三.腐蚀 四.卷积核获取 五.膨胀 六.开运算 七.闭运算 八.形态学梯度 九.顶帽运算 十.黑帽运算 总结 背景 形态学处理方法是基于对二进制图像进行处理的,卷积核决定图像处理后的效果:形态学的处理哦本质上相当于对图像做前处理,提取出有用的特征,以便后续的目标识别等任务: 一.图像二值化 定义:将图像的每个像素变成两种值,如0和255: 全局二值化的函数原型: threshold(img,thresh,maxVal,type) img:最好是灰度图像

  • Python OpenCV形态学运算示例详解

    目录 1. 腐蚀 & 膨胀 1.1什么是腐蚀&膨胀 1.2 腐蚀方法 cv2.erode() 1.3 膨胀方法 cv2.dilate() 2. 开运算 & 闭运算 2.1 简述 2.2 开运算 2.3 闭运算 3. morphologyEx()方法 3.1 morphologyEx()方法 介绍 3.2 梯度运算 3.3 顶帽运算 3.4 黑帽运算 1. 腐蚀 & 膨胀 1.1什么是腐蚀&膨胀 腐蚀&膨胀是图像形态学中的两种核心操作 腐蚀可以描述为是让图像沿

  • opencv形态学中的孔洞填充详细图解

    目录 1. 原理 2. 漫水填充算法 1. 原理 孔洞指的是被前景像素点或者说感兴趣的像素点包围起来的区域,这个区域是我们不感兴趣的背景区域. 数字图像处理的孔洞填充的公式为: I 为前景像素 ,c 为补集 其实孔洞填充的步骤就是一个迭代的过程: 先设置一个填充的起始点,需要在孔洞的内部.如d图所示,然后被结构元B(图c)膨胀. 然后,为了将膨胀的结果限制在孔洞内部,需要和原图(图a)的补集(图b)相交(图e),因为如果不控制膨胀的结果的话,那么膨胀会填充整个区域,而膨胀结果和原图的补集相交,会

  • C++ Opencv imfill孔洞填充函数的实现思路与代码

    目录 函数实现的中心思想 二值图 寻找连通域的关键 种子点的确定 连通域的寻找过程 条件设定 最后赋值 话不多说 直接上函数代码 主函数代码 代码框截图 实例图片 总结 函数实现的中心思想 二值图 此程序针对于二值图,寻找二值图中 像素值为0的连通域,将所有连通域的像素点分别保存下来,将符合条件的连通域的像素值 置为255: 寻找连通域的关键 针对填洞功能的实现,也就是0置为255过程,我们需要以四连通为基本点进行寻找. 种子点的确定 寻找种子点,其实就是寻找二值图中像素值为0的点,我们可以直接

  • IntelliJ IDEA 详细图解最常用的配置(适合刚刚用的新人)

    刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便以后的开发,磨刀不误砍柴工. 比如:设置文件字体大小,代码自动完成提示,版本管理,本地代码历史,自动导入包,修改注释,修改tab的显示的数量和行数,打开项目方式,等等一大堆东西. 总结一下,免得下次换了系统,还得再找一遍配置. 具体总结如下图: 设置外观和字体大小 这个呢是设置一下外观.和字体大小.放在第一个没问题. 设置编辑器的快捷键,也就是keymap 这个是修改咱习惯的快捷键映射表,因为我是从eclipse转来的,估计大

  • Java中Properties 类的详细使用

    我把你的头像,设置成我的名字,此刻你便与我同在. 我把你的名字,写进我的代码里面,以后,我的世界便存在着你. 一.Properties 类 Properties 类位于 java.util.Properties ,是Java 语言的配置文件所使用的类, Xxx.properties 为Java 语言常见的配置文件,如数据库的配置 jdbc.properties, 系统参数配置 system.properties. 这里,讲解一下Properties 类的具体使用. 以key=value 的 键值

  • springboot集成opencv实现人脸识别功能的详细步骤

    前言 项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,由于成本高昂不得不寻求替代方案. 什么是opencv? OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上.轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Java.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. 项目集成步骤 由于项目是放在Linux系统中跑的

  • 浅谈Java中Properties类的详细使用

    目录 一.Properties 类 二.打印JVM参数 三.打印自定义.properties文件中的值 3.1.list输出到控制台用绝对路径加载 3.2.propertyNames输出getClass()加载 3.3.stringPropertyNames输出getClassLoader加载(推荐) 四.获取值getProperties 五.写入到Properties文件 5.1.普通写入,中文时乱码 5.2.解决乱码写入的问题 六.加载和导出到xml配置文件 6.1.导出到.xml配置文件s

  • OpenCV 视频中火焰检测识别实践

    主要完成两个视频中火焰的检测,主要结合RGB判据和HIS判据,设定合适的阈值条件,检测出火焰对应像素的区域,将原图二值化,经过中值滤波以及数学形态学的膨胀运算等图像处理,消除一些噪声及离散点,连通一些遗漏的区域.基于OpenCV的开源库,在VS2013平台上,实现了两个视频中火焰的检测. 利用OpenCV有强大的图像处理库,直接将图像分离为RGB三通道,设置条件限制,找到火焰的像素位置,将原图处理成二值图像.对于火焰检测,本文结合RGB判据和HIS判据,分割出火焰的区域.一般用于人眼观看的颜色模

  • Java 超详细图解集合框架的数据结构

    目录 1.什么是集合框架? 2.Collection接口 1.通过泛型来指定相应集合中的对象类型 2.Collection常见方法使用 3.Map 接口 Map常见方法使用 4.具体的实现类 1.什么是集合框架? 在java中,有一套现成的数据结构,例如顺序表,链表,队列,栈,优先级队列,哈希表等,被封装成了相应的接口/类,供程序员直接使用,只需要创建相关的对象即可以使用,而不需要再实现其内部结构. 集合,就是将多个元素置于一个单元中,用于对这些元素进行增删改查,存储以及管理.例如,一副扑克牌(

  • C语言详细图解浮点型数据的存储实现

    目录 在引入知识之前,先来看一个案例,就知道了解浮点型数据存储的重要性与必要性. 举个例子: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int num = 9; float *pnum = (float *)&num;//强制转换类型 printf("n的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pnum); *pnum =

随机推荐