本节开始讨论图像形态学处理,这是上篇,将介绍与二值形态学相关的内容,重点介绍两种基本的二值形态学操作:腐蚀和膨胀,以及三种复合二值形态学操作:开、闭和击中击不中变换。
目录
9.1 基础
9.1.1 起源
数学形态学(Mathematical morphology)是一门研究形态和结构的学科,主要应用于图像处理和数据分析领域。它通过建立数学模型来描述和分析各种形态,包括形状、大小和结构等信息。
数学形态学的研究可追溯到20世纪60年代,1964年由法国科学家Matheron及其学生Serra在从事铁矿核的定量岩石学分析过程中,提出了数学形态学理论,后来又由Serra将其推广到图像处理中。其代表性成果是1982年由Serra撰写的专著“Image Analysis and Mathematical Morphology”。
随着计算机技术的不断发展,数学形态学在图像处理领域的应用越来越广泛,逐渐成为图像处理领域中的重要分支,在文字识别、显微成像分析、医学图像、工业检测、机器视觉等领域都有成功的应用案例,主要涉及到图像处理技术包括:图像增强、分割、恢复、边缘检测、纹理分析等。
9.1.2 理论基础
数学形态学是分析几何形状和结构的数学方法,它是建立在集合代数基础上,用集合论的方法定量描述目标几何结构的学科。
基本操作如下:利用一个结构元素(相当于模板)去探测一个对象,看是否能将该结构元素合适地放置在对象的内部,同时验证放置结构元素的方法是否有效。
在对象内部适合仿佛结构元素的位置做标记,从而得到关于对象结构的信息。这些信息与结构元素的尺寸和形状都相关。构建不同的结构元素,便可得到不同的分析结果。
(a)结构元
数学形态学运算是在结构元(Structuring Elements)作用下进行的,利用它与二值图像对应的区域进行特定的逻辑运算。结构元类似空域滤波的模板。它是指一种特殊定义的邻域结构,在图像中不断移动结构元,就可以考察图像之间各部分的关系,其形状、尺寸的选择决定了数学形态学运算的效果。
结构元可以是任意形状和尺寸,且有一个原点(Original point 或 Anchor point)。但结构元一般是对称形状,且原点通常位于中心的位置。
Skimage通过morphology子模块实现对形态学处理的支持。该子库提供了多种结构元的定义方式。
- skimage.morphology.disk(radius, dtype, strict_radius, decomposition):碟形
- skimage.morphology.ellipse(width, height, dtype, decomposition):椭圆形
- skimage.morphology.octagon(m, n, dtype, decomposition):八边形
- skimage.morphology.rectangle(nrows, ncols, dtype, decomposition):矩形
- skimage.morphology.square(width, dtype, decomposition):正方形
- skimage.morphology.diamond(radius, dtype, decomposition):菱形
- skimage.morphology.star(a, dtype):星形
- skimage.morphology.ball(radius, dtype, strict_radius, decomposition):球形(立体)
- skimage.morphology.cube(width, dtype, decomposition):立方体(立体)
- skimage.morphology.octahedron(radius, dtype, decomposition):八面体(立体)
其中,前六种是2D结构元,后三种是3D结构元。以下是一段绘制各种结构元的例子:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage.morphology import (square, rectangle, diamond, disk, cube,
octahedron, ball, octagon, star)
# Generate 2D and 3D structuring elements.
struc_2d = {
"square(15)": square(15),
"rectangle(15, 10)": rectangle(15, 10),
"diamond(7)": diamond(7),
"disk(7)": disk(7),
"octagon(7, 4)": octagon(7, 4),
"star(5)": star(5)
}
struc_3d = {
"cube(11)": cube(11),
"octahedron(5)": octahedron(5),
"ball(5)": ball(5)
}
# Visualize the elements.
fig = plt.figure(figsize=(8, 8))
idx = 1
for title, struc in struc_2d.items():
ax = fig.add_subplot(3, 3, idx)
ax.imshow(struc, cmap="Paired", vmin=0, vmax=12)
for i in range(struc.shape[0]):
for j in range(struc.shape[1]):
ax.text(j, i, struc[i, j], ha="center", va="center", color="w")
ax.set_axis_off()
ax.set_title(title)
idx += 1
for title, struc in struc_3d.items():
ax = fig.add_subplot(3, 3, idx, projection=Axes3D.name)
ax.voxels(struc)
ax.set_title(title)
idx += 1
fig.tight_layout()
plt.show()
(b)基本操作
形态学涉及到两种基本操作,并考察两个对象之间的三种关系,在此逐一说明。
两种操作:平移(Translation)、反射(Reflection)。
(1)平移操作
将集合A平移x,可表示为Ax,可表示为:
(2)反射操作
将集合A相对于原点做对称变换,将其结果记为,称为A的反射。
以二维空间情况为例,有。
(c)三种关系
三种关系:适合、击中、击不中。
设A为对象区域,B为结构元素,则将B在A所在的图像区域内移动,根据两者之间的位置关系不同,可分为三类:
- B被A包含,称为B适合(fit)A:
- B与A相交,称为B击中(hit)A:
- B与A不相交,称为B击不中(miss)A:
下图所示分别是三种关系的示意图,从左至右分别代表:适合、击中和击不中三种情况。
9.2 基本操作
数学形态学学的基本操作有两种:腐蚀(Erosion)和膨胀(Dilation)。
9.2.1 腐蚀
腐蚀操作的一种数学定义式如下:
令用集合B腐蚀集合A,表示为,其定义式为:
腐蚀操作表示将B平移x后,(B)x与A满足适合操作的所有平移坐标点x的集合。
将A看作是对象,B看作是模板,则是由在整幅图像中平移B的过程中,所有可以放置在A内部的模板B的原点所构成的点集。
一般情况下,如果原点在结构元B的内部,则腐蚀后的对象是原对象的一个子集;如果原点不在结构元内部,则腐蚀后的图像可能不在输入图像的内部,但输出的形状保持不变。
9.2.2 膨胀
膨胀可以视为腐蚀才做的互偶运算(注意,不是逆运算)。
在进行膨胀操作时,先对原始的结构元B进性反射处理,得到,然后在整幅图像内平移
,所有令
和A满足击中操作,即交集不为空集的
原点所构成的点集,都划归为的膨胀的结果。
其基于集合操作的定义式如下:
9.2.3 实现
腐蚀使图像中对象部分被腐蚀,“邻域被蚕食”,腐蚀的效果拥有比原对象更小的高亮区域,可以去掉毛刺,去掉孤立的像素,提取骨干信息。
膨胀使图像中的对象区域进行膨胀,“邻域扩张”,膨胀效果拥有比原图更大的高亮区域;膨胀操作可以填补图像缺陷,用来扩充边缘或填充小的孔洞,也可以用来连接两个分开的物体。
Skimage提供了形态学腐蚀和膨胀的基本操作的实现。
- skimage.morphology.erosion(image, footprint, out, shift_x, shift_y):面向灰度图像的腐蚀
- skimage.morphology.dilation(image, footprint, out, shift_x, shift_y):面向灰度图像的膨胀
- skimage.morphology.binary_erosion(image, footprint, out):面向二值图像的腐蚀
- skimage.morphology.binary_dilation(image, footprint, out):面向二值图像的膨胀
- skimage.morphology.isotropic_dilation(image, radius, out, spacing):速度更快
- skimage.morphology.isotropic_erosion(image, radius, out, spacing):速度更快
9.3 复合操作
在腐蚀和膨胀基础之上,可以构建三种复合操作,即:开、闭和击中击不中运算。
腐蚀和膨胀会显著改变对象的尺寸。开运算和闭运算在完成类似腐蚀和膨胀相似功能的同时,不会明显改变对象的尺寸。
9.3.1 开/闭运算
开运算(Open)就是先腐蚀后膨胀的过程,通常用于去除噪点、断开狭窄的狭颈、消除细长的突出、平滑物体边界但不改变面积。结构元 B 对集合 A 的开运算定义为
闭运算(Close)就是先膨胀后腐蚀的过程,通常用于弥合狭窄的断裂和细长的沟壑,消除小孔,填补轮廓中的缝隙,消除噪点,连接相邻的部分。结构元 B 对集合 A 的闭运算定义为:
9.3.2 击中击不中
击中-击不中(Hit-Missing Transform)是形态检测的基本工具,可以实现对象的细化和剪枝操作,常用于物体识别、图像细化。
击中-击不中变换变换定义为两个结构元对对集合 A 的运算:
上式中,结构元 B1 对图像上进行腐蚀、结构元 B2 对图像的补集进行腐蚀,二者的结果相减得到击中-击不中变换。
击中击不中变换有两个结构元,B1 是当前位置可以有的形状,B2是当前位置不可以有的形状,虽然总体而言这两个结构元应该被视为一体,但在实际运算中是先后进行两次腐蚀运算,然后取交集。
9.3.3 实现
Skimage提供了多种类型的开、闭运算的实现,列表如下:
- skimage.morphology.opening(image, footprint, out):灰度图像开运算
- skimage.morphology.closing(image, footprint, out):灰度图像闭运算
- skimage.morphology.binary_opening(image, footprint, out):二值图像开运算
- skimage.morphology.binary_closing(image, footprint, out):二值图像闭运算
- skimage.morphology.isotropic_opening(image, radius, out, spacing):更快的二值图像开运算
- skimage.morphology.isotropic_closing(image, radius, out, spacing):更快的二值图像闭运算
- skimage.morphology.area_closing(image, area_threshold, connectivity, parent, tree_traverser)
- skimage.morphology.area_opening(image, area_threshold, connectivity, parent, tree_traverser)
- skimage.morphology.diameter_opening(image, diameter_threshold, connectivity, parent, tree_traverser)
- skimage.morphology.diameter_closing(image, diameter_threshold, connectivity, parent, tree_traverser)
其中,后四种开/闭运算主要针对特定情况的对象。
对于HMT,Skimage没有给出直接的实现,可以根据定义,并结合基本开闭运算完成。
至此,本节介绍了有关形态学处理的理论基础,以及两类基本操作和三类复合操作。
下一节讲继续介绍这些操作在二值图像和灰度图像的应用。
(本节初稿完成时间:2024-04-09 )