数字图像处理(第三版)学习笔记第九章

一、基础知识

数学形态学的语言是集合论,为大量的图像处理问题提供了一种一致且有力的方法。数学形态学中的集合表示图像中的对象。在形态学中集合的反射和平移广泛用来表示基于结构元(SE)的操作:研究一幅图像中感兴趣特性所用的小集合或子图像。

二、腐蚀和肿胀

1.腐蚀

假定Z^2中有集合A和B,表示B对A的腐蚀定义为A\Theta B=\left \{ z|(B)_z\subseteq A \right \},指出了B对A的腐蚀是一个用z平移的B包含在A中所有的点z的集合。腐蚀会缩小或细化二值图像中的物体,可以将其看成一个形态学滤波操作,将小于结构元的图像细节从图像中滤除了。下图为对图像进行腐蚀操作的实验,其代码为:

import cv2  
from matplotlib import pyplot as plt
import numpy as np  

image = cv2.imread(r'D:\test\fushi.png', cv2.IMREAD_GRAYSCALE)  
kernel = np.ones((5, 5), np.uint8)   
eroded_image = cv2.erode(image, kernel, iterations=1)  
plt.rcParams['font.sans-serif'] = ['SimHei']  
plt.subplot(231), plt.imshow(image, 'gray'), plt.title('原始图像'), plt.axis('off')
plt.subplot(232), plt.imshow(eroded_image, 'gray'), plt.title('腐蚀*1'), plt.axis('off')
eroded_image = cv2.erode(eroded_image, kernel, iterations=1)
plt.subplot(233), plt.imshow(eroded_image, 'gray'), plt.title('腐蚀*2'), plt.axis('off') 

kernel = np.ones((10, 10), np.uint8) 
eroded_image = cv2.erode(image, kernel, iterations=1) 
plt.subplot(234), plt.imshow(eroded_image, 'gray'), plt.title('腐蚀(核为10)'), plt.axis('off') 

kernel = np.ones((15, 15), np.uint8) 
eroded_image = cv2.erode(image, kernel, iterations=1) 
plt.subplot(235), plt.imshow(eroded_image, 'gray'), plt.title('腐蚀(核为15)'), plt.axis('off') 
plt.show()

其结果为: 

 

这个实验消除了原图像中小于5*5大小的物体的,最终得到了腐蚀*1结果的那种形式,但是对于原图像较粗的线并没消除只是细化了,可以再次对其进行一次腐蚀操作,就可以得到腐蚀*2的结果,原本两条斜着的线被消除了;或者也可以修改结构元大小为10*10就能消除前面只能细化的线,但是上下还是存在两条线。可以选择修改结构元大小为15*15就能得到消除完的结果。

2.膨胀

假定Z^2中有集合A和B,表示B对A的膨胀定义为A\oplus B =\left \{ z|(\hat{B})_z\bigcap A\neq \varnothing \right \},是以B关于它的原点的映像,并且以z对映像进行平移为基础的。膨胀以集合操作为基础,是一个非线性操作,卷积是一种线性操作。膨胀会增长或粗化二值图像中的物体,粗化的宽度由所用的结构元来控制的。形态学方法可以直接在一幅二值图像中直接得到结果。下图为使用5*5的矩阵元素对原图像进行一次膨胀操作的结果,其代码为:

import cv2  
import numpy as np  
  
# 读取图像  
image = cv2.imread(r'D:\test\pengzhang.png', cv2.IMREAD_GRAYSCALE)  
kernel = np.ones((5, 5), np.uint8)  
dilated_image = cv2.dilate(image, kernel, iterations=1)   
cv2.imshow('Original Image', image)  
cv2.imshow('Dilated Image', dilated_image)   
cv2.waitKey(0)  
cv2.destroyAllWindows()

膨胀可以把原来比较细的线变粗,如上图所示,可以明细 的看到数字3变得比原来更粗了。这里使用的是opencv库里面的dilate函数进行膨胀操作。

3.对偶性

B对A的腐蚀是\hat{B}A^c的膨胀的补。可以用相同的结构元简单的使用B膨胀图像的背景,并对该结果求补就可以得到B对该幅图像的腐蚀。

三、开操作和闭操作

开操作一般会平滑物体的轮廓、断开较窄的狭颈并消除细的突出物;闭操作通用会平滑轮廓的一部分,但他会弥合较窄的简短个细长的沟壑,消除小的孔洞,填补轮廓线中的断裂。B对A的开操作就是B对A的腐蚀,接着用B对结果进行膨胀;B对A的闭操作就是用B对A膨胀,接着用B对结果进行腐蚀。

开操作和闭操作关于数据集的求补和反射也是对偶的。下图为使用10*10的矩阵元素对原图像进行一次开操作和对原图像进行一次闭操作的结果,其代码为:

import cv2  
import numpy as np  
  
# 读取图像  
image = cv2.imread(r'D:\test\kai.png', cv2.IMREAD_GRAYSCALE)    
kernel = np.ones((10, 10), np.uint8)  
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)   
closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)  
cv2.imshow('Original Image', image)  
cv2.imshow('Opening Image', opening)  
cv2.imshow('Closing Image', closing)   
cv2.waitKey(0)  
cv2.destroyAllWindows()

 上面第二张图是进行开操作的结果,可以看到原图像中的小点被消除了,只留下了较大的一个图像;第三张图是进行闭操作,可以观察到大的图案的转折处变得比原来光滑了。

四、击中或击不中变换

形态学击中或击不中是形状检测的一个基本工具。如果B表示由D及其背景组成的集合,则B在A中的匹配,表示为A\circledast B=(A\circleddash D)\cap [A^c\circleddash (W-D)],令B_1表示与一个目标相联系的B的元素构成的集合,B_2表示与相应背景相联系的B的元素构成的集合,可将式子转换为A\circledast B=(A\circleddash B_1)\cap (A^c\circleddash B_2),又通过腐蚀和膨胀间的关系可将该式子转换为A\circledast B=(A\circleddash B_1)\cap (A\oplus \hat{B_2}),上述式子被叫做形态学击中或击不中变换。

五、形态学算法

边界提取是由表示为\beta (A)的集合A的边界可以通过先用B对A腐蚀,在执行A和腐蚀的结果之间的集合之差得到。下图为对图像进行边缘提取的结果,其代码为:

import cv2  
import numpy as np  
   
image = cv2.imread(r'D:\test\111.jpeg', cv2.IMREAD_GRAYSCALE)  
low_threshold = 50  
high_threshold = 150  
edges = cv2.Canny(image, low_threshold, high_threshold)  
cv2.imshow('Original Image', image)  
cv2.imshow('Edge Image', edges)   
cv2.waitKey(0)  
cv2.destroyAllWindows()

孔洞是由前景像素相连接的边界所包围的一个背景区域,孔洞填充指的就是填充图像中的孔洞。下面为一个实现孔洞填充的例子,首先需要将输入的图像转化为二值图像,

从二值图像中提取连通分量是许多自动图像分析应用的核心。连通分量经常用于自动检测。

如果在集合A内连接任意两个点的直线段都在A的内部,那么集合A是凸形的,任意集合S的凸壳H是包含于S的最小凸集,集合差H-S称为S的凸缺。文中所讲的获取凸壳的方法存在的缺点为凸壳可能会超过确保凸性所需的最小尺寸,可以通过限制生长来减少这个影响。

结构元B对集合A的细化可以通过击中或击不中变换来定义。对称的细化A的还有一种方法是以结构元序列为基础的。粗化是细化的形态学对偶。

集合A的骨架可以用腐蚀和开操作来表达,裁剪方法是对细化和骨架算法的补充。过程中会保留一些寄生分量,需要用后处理来清楚这些寄生分量。

形态学重建涉及两幅图像和一个结构元,其中一幅图像为标记,包含变换的起始点,另一幅图像为模板,约束改变换。结构元用来定义连接性。它的核心是测地膨胀和测地腐蚀。有限数量图像的测地膨胀和腐蚀经过有限数量的迭代步骤后会收敛,因为标记图像的扩散或搜索受模板约束。形态学重建可以应用于重建开操作,填充孔洞,边界清楚等领域。

六、灰度级形态学

1.基本操作

主要是把前面的膨胀、腐蚀、开操作和闭操作扩展到灰度级图像。灰度级形态学中的结构元执行的基本功能和二值化形态学中所对应的功能相同,都是作为一个探测器以明确的特性检验一幅给定的图像。其分为非平坦的和平坦的结构元。

当b的原点位于(x,y)时,用一个平坦的结构元b在(x,y)处对图像f的腐蚀定义为图像f中与b重合区域的最小值。为寻求b对f的腐蚀,需要把结构元的原点放在图像每一个像素的位置。膨胀的定义类似腐蚀,不过选区的重合区域的最大值。

灰度级图像的开操作和闭操作的表达式与二值图像的对应操作具有相同的形式。开操作用于去除较小的明亮细节,而保持整体灰度级和较大的明亮特征相对不变。

2.灰度级形态学算法

形态学平滑:基于开操作抑制比结构元小的亮细节,而闭操作抑制暗细节,所以以形态滤波的形式结合起来用于图像平滑和噪声去除。

形态学梯度是由膨胀和腐蚀与图像相减结合起来就可以得到。膨胀和腐蚀的差强调了区域间的边界,它的最终结果是边缘被增强而同质区域的贡献被抑制掉的图像。

顶帽变换底帽变换是由图像相减与开操作和闭操作相结合产生的。其应用为用一个结构元通过开操作或闭操作从一幅图像中删除物体。顶帽变换用于暗背景上的亮物体,底帽变换相反。

粒度测定属于判断图像中颗粒的尺寸分布的领域。形态学可以间接用于估计颗粒的尺寸分布,而不需要识别并测量图像中的每个颗粒。原理是对于比背景亮且具有规则形状的颗粒,由使用逐渐增大的结构元对图像执行开操作组成。

分割时将一幅图像分为区域的处理,

3.灰度级形态学重建

灰度级形态学重建使用的方法和二值图像的相差不大,灰度级标记图像f对灰度级模板图像g的膨胀形态学重建定义为f关于g的测地膨胀反复迭代直至达到稳定。重建顶帽是从一幅图像中减去其重建的开操作。

总结

本章介绍了形态学图像处理,用于从图像中提取和描述物体的形状特征。首先介绍了数学形态学的基本概念,它是一种用于分析图像几何结构的理论。其次就是基本的形态学运算,腐蚀和肿胀是形态学图像处理的基础,其互为对偶运算。开操作和闭操作也是互为对偶的。击中或击不中变换是形态学中的一种基本工具,用于检测图像中特定形状的模式。之后就是对于一些基本形态学算法的讲解,他们在图像处理的领域有着重要的使用价值,比如可以用于图像分割和形状识别等。最后把讲解的形态学算法扩展到了灰度级图像之中去。

在本章中进行的实验基本上使用的都是opencv的库函数,可以直接通过调用库函数来时先文中所讲的腐蚀、膨胀和开操作等操作。比如erode是进行腐蚀操作的函数,dilate是进行膨胀操作的函数等等。

  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值