白菜苗

  • 1、什么是膨胀(如果已经了解,请往下看)
  • 2、什么是孔洞填充(如果已经了解,请往下看)
  • 3、什么是形态学重建(如果已经了解,请往下看)
  • 4、什么是测地膨胀(如果已经了解,请往下看)
  • 5、什么是形态学重建之孔洞填充(终于到正题了)
  • 6、实验

如果你不小心又亦或是专门寻找形态学相关知识,那么很高兴能和你们分享这篇文章。

首先,如果想了解形态学重建之孔洞填充原理,那么必须先了解什么是膨胀、什么是孔洞填充、什么是形态学重建、什么是测地膨胀,只有具备相关知识,我们才能把形态学重建之孔洞填充原理吃透。

话不多说!!我们看看

1、什么是膨胀(如果已经了解,请往下看)


这是来源于冈萨雷斯数字图像处理(第三版)的公式,如果光看字面晦涩难懂,那看看例子:

  • 左边,是原图,一个边长ddd的正方形,至于左上角的小正方形是用来膨胀画上去的。
  • 右边,变为膨胀后的一个边长(18+1+18)d(\frac{1}{8} +1+\frac{1}{8})d(81​+1+81​)d的正方形。

那么怎么会这样呢?你可以这样理解,小正方形(即边长d/4d/4d/4的正方形)的中心可以在大的正方形里面运动,但是起不到膨胀效果,只有当它的中心点(即那个黑点)在边界运动时,是不是有d/8d/8d/8露在大正方形外面(看左边那个图),沿着边界绕一圈,是不是整个边长都会多了d/8d/8d/8,其实中心思想就是取并集,只要我的中心点在大正方形以内(包括边界),凡是能包含的地方,就是我俩共有的地方(即膨胀后的图形)。

同理可得:

2、什么是孔洞填充(如果已经了解,请往下看)

孔洞:一个孔洞可以被定义为由前景像素相连接的边界所包围的一个背景区域。(左到右依次是未填充,填充一部分、填充完毕)


有点抽象是不是,其实它的意思就是先找孔洞的一个点,用结构元去膨胀,然后用原图像的补集进行约束(就是求个交集),不断重复膨胀,约束直至图形不改变(即收敛)就停止,与原图求个交集,孔洞就填上了,那我们看看如何填充的:(AAA原图,AcA^cAc补集,BBB结构元,先在原图需要填充部分找一个点,进行膨胀)












到此,填充完毕,如果你还纠结,那么我们思路理一下,例如X1X_1X1​为什么从第一张图变成第二张,是因为图1,是膨胀后的,还需要AcA^cAc补集约束一下,就是求个交集才是最后图形,其它以此类推,为什么到了X8X_8X8​停下了呢,因为到这里已经收敛了,再膨胀也是X8X_8X8​这张图形。

3、什么是形态学重建(如果已经了解,请往下看)

4、什么是测地膨胀(如果已经了解,请往下看)


测地膨胀,说白了,和前面的膨胀思想有点区别,前面的膨胀其实就是直接膨胀,测地膨胀呢?其实就是有条件的膨胀,怎么说,我们看看图:


一开始膨胀了是3*3个格子,中间那图,然后再跟模板IcI^cIc求个交集,那么就是测地膨胀的思想:先膨胀后约束(即求交集)。


哈哈哈哈,是不是以为测地膨胀结束了,其实不是,这只是第一步,后面不断重复迭代,直至收敛,就是前面说到为什么到X8X_8X8​就停止是一样的,前一跟后一个一样就没必要继续了。


5、什么是形态学重建之孔洞填充(终于到正题了)


首先,F(x,y)F(x,y)F(x,y)呢,其实求标记图像的方法,很简单,就是减去原始预想的边界值,其它地方为0,H则是我们要的结果。(看下图,对比下,是不是清楚点,边界取反,其它地方为0)

如果懂了,继续往下:用3*3的结构元BBB去膨胀F。


  • 左1图为膨胀一次的结果,我们不是说了吗,测地膨胀的精髓在于,先膨胀,后约束,那么我们用IcI^cIc(原始图像III的补集)约束下,得到最右边图。

然后多次迭代。


可以发现,其实图形迭代一次就收敛了(这图刚好凑巧,其它可能多次)


H是我们要的结果,那么左1图,就是H公式里面的函数,[]c[]^c[]c里面的其实就是补集的意思,所以对左1图取个补集就是H,细看,是不是填充好了。到此形态学重建之孔洞填充完成。

6、实验

代码:(非我所写:参见链接)

import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg = cv.imread("text.jpg")# 二值化
imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
imgray[imgray < 100] = 0
imgray[imgray >= 100] = 255# 原图取补得到MASK图像
mask = 255 - imgray# 构造Marker图像
marker = np.zeros_like(imgray)
marker[0, :] = 255
marker[-1, :] = 255
marker[:, 0] = 255
marker[:, -1] = 255
marker_0 = marker.copy()# 形态学重建
SE = cv.getStructuringElement(shape=cv.MORPH_CROSS, ksize=(3, 3))
while True:marker_pre = markerdilation = cv.dilate(marker, kernel=SE)marker = np.min((dilation, mask), axis=0)if (marker_pre == marker).all():break
dst = 255 - marker
filling = dst - imgray# 显示
plt.figure(figsize=(12, 6))  # width * height
plt.subplot(2, 3, 1), plt.imshow(imgray, cmap='gray'), plt.title('src'), plt.axis("off")
plt.subplot(2, 3, 2), plt.imshow(mask, cmap='gray'), plt.title('Mask'), plt.axis("off")
plt.subplot(2, 3, 3), plt.imshow(marker_0, cmap='gray'), plt.title('Marker 0'), plt.axis("off")
plt.subplot(2, 3, 4), plt.imshow(marker, cmap='gray'), plt.title('Marker'), plt.axis("off")
plt.subplot(2, 3, 5), plt.imshow(dst, cmap='gray'), plt.title('dst'), plt.axis("off")
plt.subplot(2, 3, 6), plt.imshow(filling, cmap='gray'), plt.title('Holes'), plt.axis("off")
plt.show()

结果:

我解释下,(从上开始数)src图为原始图,Mask为它的补集,Marker 0 为标记图像F,其实应该有白边框,估计像素小看不见,Marker为膨胀约束后的最后结果,dst为Marker补集图(即H),Holes图为dst∩Mask\color{purple}{dst \cap Mask}dst∩Mask,就是填充部分。

对于结构元的选择不宜过大,不然填充不上。


明显发现3∗33*33∗3的结构元优于7∗77*77∗7的,(看下图)因为结构元过大,两个图像一样,取个补集就是原图III,所以孔洞没填充上,所以选择结构元得适中。

到此结束,希望能帮助到你\color{maroon}{到此结束,希望能帮助到你}到此结束,希望能帮助到你

形态学重建之孔洞填充相关推荐

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

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

  2. 形态学重建:孔洞填充的python实现

    主要参考:(美)拉斐尔·C.冈萨雷斯. 数字图像处理 第3版[M]. 阮秋琦,译. 北京:电子工业出版社, 2017: 633. 形态学重建 形态学重建涉及两幅图像和一个结构元: Marker 图像: ...

  3. 【youcans 的 OpenCV 例程200篇】135. 形态学重建之粒度测定

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

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

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

  5. 二值图像--形态学处理4 击中,边界提取,孔洞填充,连通分量提取,凸壳,细化,骨架,形态学重建...

    学习DIP第14天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

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

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

  7. 【youcans 的 OpenCV 例程200篇】124. 孔洞填充的泛洪算法

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

  8. opencv实现二值图像孔洞填充

    matlab中的imfill函数可以方便得实现二值图像的孔洞填充,而在opencv中并没有相同功能的函数.因此,在opencv的基础上编写实现孔洞填充的函数,并且能够设定阈值,对面积大于阈值的孔洞不进 ...

  9. 数字图像处理(作业三)——孔洞填充+全局阈值+自适应阈值

    一.孔洞填充 基本思想: 基于形态学算法,膨胀后与上取反的原图 算法实现步骤: 1.首先找出所有孔洞的位置,只需知道洞中的一个点的坐标即可,下面直接以改点代替该洞 2.新建一张全零图,用0表示背景,1 ...

最新文章

  1. 系统学习Spring之Spring in action(二)
  2. Qt Creator导出QML
  3. 智能可穿戴平台,你更看好谁?
  4. 计算机用户登录设置成2000,2008计算机等级考试:Windows2000系统选项设置
  5. Process finished with exit code 139(interrupted by signal 11):SIGSEGV
  6. python提取pdf表格信息
  7. 苹果自带相册打马赛克_哥们被绿?iOS 13惊现漏洞,马赛克去除
  8. java jar 版本号,比较两个jar包的版本号
  9. 用curl自动登录HTTPS站点
  10. Dart中dynamic,var,object三者的区别
  11. star cd linux安装,STAR-CD的Linux版安装详细过程
  12. 李江涛:使用Sakai构建开放式教学平台
  13. 【C语言程序】带你用17行代码编译一个C语言数字雨
  14. 【Ubuntu破解UltraEdit】破解UltraEdit
  15. Payment支付平台API接口文档
  16. 别人都不知道的“好用”网站,让你的效率飞快
  17. Quartz 是什么?一文带你入坑
  18. Dell intel i5 1135笔记本 win10 ubuntu18.04双系统
  19. 最新版sketch插件怎么安装,3步搞定
  20. finclip小程序运行机制与微信小程序运行机制

热门文章

  1. 给定一个数组int[] array={1,2,3,4,5,6,7,8,9,10}.将其前5个元素与后5 个元素对换,即第1 个元素与第10个元素互换,第2个与第9个元素互换...第5 个与第6 个元素
  2. 最新‘微信小程序’反编译最新教程(如何找回微信小程序源码手把手教程)
  3. 换用国内apt源解决树莓派安装ubuntu后apt-get速度慢的问题
  4. 使用Python Link SDK接入阿里云物联网平台
  5. 51单片机自动售货机设计
  6. 如何快速涨粉?【CSDN攻略】规则解读及方案实施
  7. Python怎么买入卖出
  8. QCC304x/QCC514x Pydbg在线调试
  9. Matlab子图间距和边缘距离调整
  10. 19.系统知识-数字证书