形态学重建之孔洞填充
白菜苗
- 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}{到此结束,希望能帮助到你}到此结束,希望能帮助到你
形态学重建之孔洞填充相关推荐
- 【youcans 的 OpenCV 例程200篇】132. 形态学重建之孔洞填充算法
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...
- 形态学重建:孔洞填充的python实现
主要参考:(美)拉斐尔·C.冈萨雷斯. 数字图像处理 第3版[M]. 阮秋琦,译. 北京:电子工业出版社, 2017: 633. 形态学重建 形态学重建涉及两幅图像和一个结构元: Marker 图像: ...
- 【youcans 的 OpenCV 例程200篇】135. 形态学重建之粒度测定
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...
- OpenCV函数应用:基于二值图像的三种孔洞填充方法记录(附python,C++代码)
系列文章目录 函数系列: OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形 ...
- 二值图像--形态学处理4 击中,边界提取,孔洞填充,连通分量提取,凸壳,细化,骨架,形态学重建...
学习DIP第14天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...
- 【youcans 的 OpenCV 例程200篇】123. 形态算法之孔洞填充
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...
- 【youcans 的 OpenCV 例程200篇】124. 孔洞填充的泛洪算法
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...
- opencv实现二值图像孔洞填充
matlab中的imfill函数可以方便得实现二值图像的孔洞填充,而在opencv中并没有相同功能的函数.因此,在opencv的基础上编写实现孔洞填充的函数,并且能够设定阈值,对面积大于阈值的孔洞不进 ...
- 数字图像处理(作业三)——孔洞填充+全局阈值+自适应阈值
一.孔洞填充 基本思想: 基于形态学算法,膨胀后与上取反的原图 算法实现步骤: 1.首先找出所有孔洞的位置,只需知道洞中的一个点的坐标即可,下面直接以改点代替该洞 2.新建一张全零图,用0表示背景,1 ...
最新文章
- php7安装redis6扩展
- Entity Framework Core 2.0的新特性
- jquery刷新iframe页面的方法(兼容主流)
- 计算机没有autoCAD_挑战在一年内用晚上业余时间学会灵活运用CAD(1)|cad|autocad|图学|计算机|电子电路...
- ABAP日期函数应用
- oracle group by用法_从OceanBase TPCC测试报告看ORACLE兼容性进展
- 【动态规划】石子合并
- linux man手册_Linux微操(基于Centos)
- Flutter拓展 在Android studio中导入Flutter项目报错
- php 怎么判断月份最后一天_PHP基础案例三:判断学生星座
- 染色问题 —— 扇形涂色
- 光立方原理讲解_3D打印设备SLA工艺原理是什么?
- 几行代码教你轻松瓜分双十一20亿红包
- 从五个维度来谈谈视觉设计师如何阐述设计风格
- 爬取大麦网的演出数据
- Dockerfile: max depth exceeded
- LeetCode——517. 超级洗衣机(Super Washing Machines)[困难]——分析及代码(C++)
- Highcharts 操作series 的data里的数据
- Java中的equals和==比较
- 帝国时代2决定版服务器维护,帝国时代2决定版闪退问题解决方法
热门文章
- 因缺失增量信息而导致recoverseg恢复失败的情况
- 目标检测算法——单次目标检测器
- 2020-2021阿里巴巴Java面试真题解析,面试真题解析
- Python statsmodel回归 添加截距项
- 经济学人信息部:2012年大数据研究报告:商业领袖们的经验
- 计算机系统配置有哪些内容,组装电脑主要配置有哪些丨组装电脑主要配置图解...
- 基于预训练模型 ERNIE 实现语义匹配
- 2019 蓝桥杯省赛 A 组模拟赛(一)C. 结果填空:马的管辖 (暴力搜索)
- 手机和PC连接同一热点,捕获TCP流
- 数学科学与计算机技术,数学科学与计算技术学院