用Skimage学习数字图像处理(018):图像形态学处理(上)

本节开始讨论图像形态学处理,这是上篇,将介绍与二值形态学相关的内容,重点介绍两种基本的二值形态学操作:腐蚀和膨胀,以及三种复合二值形态学操作:开、闭和击中击不中变换。

目录

9.1 基础

9.1.1 起源

9.1.2 理论基础

(a)结构元

(b)基本操作

(c)三种关系

9.2 基本操作

9.2.1 腐蚀

9.2.2 膨胀

9.2.3 实现

9.3 复合操作

9.3.1 开/闭运算

9.3.2 击中击不中


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,可表示为:

A_x=\{c|c=a+x,\text{for} \quad a\in A\}

(2)反射操作

将集合A相对于原点做对称变换,将其结果记为\hat{A},称为A的反射。

\hat{A}=\{w|w=-a, \text{for}\quad a\in B\}

以二维空间情况为例,有\hat{A}=A(-x,-y)

(c)三种关系

三种关系:适合、击中、击不中。

设A为对象区域,B为结构元素,则将B在A所在的图像区域内移动,根据两者之间的位置关系不同,可分为三类:

  • B被A包含,称为B适合(fit)A:B\subset A
  • B与A相交,称为B击中(hit)A:B\cap A \neq \Phi
  • B与A不相交,称为B击不中(miss)A:B\cap A = \Phi

下图所示分别是三种关系的示意图,从左至右分别代表:适合、击中和击不中三种情况。

9.2 基本操作

数学形态学学的基本操作有两种:腐蚀(Erosion)和膨胀(Dilation)。

9.2.1 腐蚀

腐蚀操作的一种数学定义式如下:

令用集合B腐蚀集合A,表示为A \ominus B,其定义式为:

A\ominus B = \{x|(B)_x \subseteq A\}

腐蚀操作表示将B平移x后,(B)x与A满足适合操作的所有平移坐标点x的集合。

将A看作是对象,B看作是模板,则是由在整幅图像中平移B的过程中,所有可以放置在A内部的模板B的原点所构成的点集。

一般情况下,如果原点在结构元B的内部,则腐蚀后的对象是原对象的一个子集;如果原点不在结构元内部,则腐蚀后的图像可能不在输入图像的内部,但输出的形状保持不变。

9.2.2 膨胀

膨胀可以视为腐蚀才做的互偶运算(注意,不是逆运算)。

在进行膨胀操作时,先对原始的结构元B进性反射处理,得到\hat{B},然后在整幅图像内平移\hat{B},所有令\hat{B}和A满足击中操作,即交集不为空集的\hat{B}原点所构成的点集,都划归为的膨胀的结果。

其基于集合操作的定义式如下:

A\oplus B=\{x|(\hat{B})_x\cap A \neq \emptyset \}

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 的开运算定义为

A\circ B=(A\ominus B)\oplus B
闭运算Close)就是先膨胀后腐蚀的过程,通常用于弥合狭窄的断裂和细长的沟壑,消除小孔,填补轮廓中的缝隙,消除噪点,连接相邻的部分。结构元 B 对集合 A 的闭运算定义为:

A\bullet B=(A\oplus B)\ominus B

9.3.2 击中击不中

击中-击不中(Hit-Missing Transform)是形态检测的基本工具,可以实现对象的细化和剪枝操作,常用于物体识别、图像细化。

击中-击不中变换变换定义为两个结构元\{A_1,A_2\}对对集合 A 的运算:

A\ast B_{1,2}=(A\ominus B_1)\cap (A^C\ominus B_2)

上式中,结构元 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 )

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值