数字图像处理 第9章-形态学图像处理

数字图像处理 第9章-形态学图像处理

形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。

这里,我们使用同一词语表示数学形态学的内容,将数学形态学作为工具从图像中提取表达和描绘区域形状的有用图像分量,如边界、骨架和凸壳等。

9.1 预备知识

数学形态学的语言是集合论。同样,形态学为大量的图像处理问题提供一种一致且有力的方法。数学形态学中的集合表示图像中的对象。例如,在二值图像中,所有白色像素的集合是该图像的一个完整的形态学描述。

9.2 腐蚀和膨胀

9.2.1 腐蚀

作为 Z 2 Z^2 Z2中的集合A和B,表示为A⊖B的B对A的腐蚀义为
A ⊖ B = { z ∣ ( B ) z ⊆ A } A⊖B=\{z|(B)_z⊆A\} AB={z(B)zA}
表面上,该式指出B对A的腐蚀是一个用z平移的B包含在A中的所有的点z的集合。

顾名思义,计算机视觉上的腐蚀操作就是将物体的边缘加以腐蚀。

9.2.2 膨胀

A和B是 Z 2 Z^2 Z2中的集合,表示为A⊕B的B对A的膨胀定义为
A ⊕ B = { z ∣ ( B ^ ) z ⋂ A ≠ Ø } A⊕B=\{z|(\hat B)_z⋂A≠Ø\} AB={z(B^)zA=Ø}
这个公式是以 B关于它的原点的映像,并且以z对映像进行平移为基础的。

B对A的膨胀是所有位移z的集合,这样, B ^ \hat B B^和A至少有一个元素是重的。根据这种解释,上式可以等价写为:
A ⊕ B = { z ∣ [ ( B ^ ) z ⋂ A ] ⊆ A } A⊕B=\{z|[(\hat B)_z⋂A]⊆A\} AB={z[(B^)zA]A}
膨胀操作与腐蚀操作相反,是将图像的轮廓加以膨胀。

腐蚀和膨胀的对应的实验代码如下:

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

img = cv2.imread('img_1.png')

kernel = np.ones((15, 15), np.uint8)

erosion = cv2.erode(img, kernel)   #腐蚀
dilation = cv2.dilate(img, kernel) # 膨胀

titles = ['Original', 'Erosion', 'Dilation']
images = [img, erosion, dilation]
plt.figure(dpi=200) #指定输出像素大小
for i in range(3):
    plt.subplot(1,3, i + 1)
    plt.imshow(images[i])
    plt.title(titles[i], fontsize=8)
    plt.xticks([]), plt.yticks([])
plt.savefig('output.png')#保存图像
plt.show()

随便画几笔:
在这里插入图片描述

运行代码,对图像处理的结果如下:
在这里插入图片描述
很直观,由于线太细了,所以腐蚀一下就看不到了,膨胀就直接把线加粗了。

腐蚀和膨胀的动画可以参考视频:腐蚀和膨胀动画演示

这之间遇到一个坑(相当于补之前的实验):
在这里插入图片描述
无法安装cv2,但并不是直接安装cv2,而是需要安装opencv库,命令如下:

pip install opencv-python

直接下载速度太慢,用清华源下载就会快很多:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

测试一下:

import cv2
# 读取图像
image = cv2.imread("image.jpg")

# 将图像转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 显示灰度图
cv2.imshow("Gray Image", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码功能是将图片转为灰度图:
在这里插入图片描述
输出如下:
在这里插入图片描述

9.2.3 对偶性

膨胀和腐蚀彼此关于集合求补运算和反射运算是对偶的,即:
( A ⊖ B ) c = A c ⊕ B ^ (A⊖B)^c=A^c⊕\hat B (AB)c=AcB^
( A ⊕ B ) c = A c ⊖ B ^ (A⊕B)^c=A^c⊖\hat B (AB)c=AcB^
B对A的腐蚀是B对A的膨胀的补,反之亦然。

9.3 开操作与闭操作

开操作一般会平滑物体的轮廓断开较窄的狭颈并消除细的突出物。闭操作同样也会平滑轮廓的一部分,但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮线中的断裂。

结构元B对集合A的开操作,表示为A。B,其定义如下:
A ∘ B = ( A ⊖ B ) ⊕ B A ∘B = (A ⊖ B)⊕B AB=(AB)B
因此,B对A的开操作就是B对A的腐蚀,紧接着用B对结果进行膨胀。

类似地,用结构元B对集合A的闭操作,表示为A·B,定义如下:
A ⋅ B = ( A ⊕ B ) ⊖ B A·B = (A ⊕ B)⊖B AB=(AB)B
七式说明,B对集合A的闭操作就是简单地用B对A膨胀,紧接着用B对结果进行腐蚀。
实验代码如下:

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

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) 

img1 = cv2.imread('img_1.png') #开运算原始图像
img2 = cv2.imread('img_1.png') #闭运算原始图像

opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)  # 开运算
closing = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, kernel)  # 闭运算

titles = ['Original','Opening','Closing']
images = [img1, opening, closing]
plt.figure(dpi=150) #指定输出像素大小
for i in range(3):
    plt.subplot(1, 3, i + 1)
    plt.imshow(images[i])
    plt.title(titles[i], fontsize=10)
    plt.xticks([]), plt.yticks([])
plt.savefig('output.png')#保存图像
plt.show()

原始图像还是刚刚那条线,将图片输入处理后,输出如下:
在这里插入图片描述
可以看到开运算几乎要把线消没了,闭运算略微的把线加粗了。

9.4 击中或不击中变换

形态学击中或击不中变换是形状检测的一个基本工具。

9.5 一些基本的形态学算法

9.5.1 边界提取

表示为 β ( A ) β(A) β(A)的集合 A的边界可以通过先用 B对 A 腐蚀,而后执行A和腐蚀的结果之间的集合之差得到,即
β ( A ) = A − ( A ⊖ B ) β(A)=A-(A⊖B) β(A)=A(AB)
其中B是一个适当的结构元。

测试代码如下:

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

img = cv2.imread('image.jpg')

kernel = np.ones((3, 3), dtype=np.uint8)
img1 = cv2.erode(img, kernel)
img2 = img - img1

plt.subplot(1, 2, 1)
plt.imshow(img, cmap='gray')
plt.axis('off')
plt.title('original')

plt.subplot(1, 2, 2)
plt.imshow(img2, cmap='gray')
plt.axis('off')
plt.title('border')

plt.savefig('output.png')
plt.show()


输入一个边界分明的正方形,输出如下:

在这里插入图片描述

9.5.2 孔洞填充

顾名思义就是填充图像中的孔洞。

用教材上的例子来看就简单明了,这里就不再演示具体的代码。
在这里插入图片描述

9.5.3 连通分量的提取

常用于自动检测,下图为含有碎骨的鸡胸X射线图像。可以通过处理我们能够提取出碎骨的图像。

在这里插入图片描述

9.6 灰度级形态学

我们将把膨胀、腐蚀、开操作和闭操作的基本操作扩展到灰度级图像。

9.6.1 腐蚀和膨胀

当b的原点位于(x,y)处时,用一个平坦的结构元b在(x,y)处对图像f的腐蚀定义为图像f中与b重合区域的最小值。

以公式的形式,结构元素b对一幅图像f在位置(x,y)处的腐蚀由下式给出:
[ f ⊖ b ] ( x , y ) = m i n ( s , t ) ∈ b { f ( x + s , y + t ) } [f⊖b](x,y)=min_{(s,t)∈b}\{ f(x+s,y+t) \} [fb](x,y)=min(s,t)b{f(x+s,y+t)}
x和y是通过所有要求的值而增加的,以便b的原点能访问f中的每一个像素。也就是说,为寻求b对f的腐蚀,我们把结构元的原点放在图像每一个像素的位置。在任何位置的腐蚀由从包含在与b重合区域中的f的所有值中选取的最小值决定。

类似地,当 b ^ \hat b b^的原点位于位置(x,y)处时,平坦结构元b在任何位置(x,y)处对图像f的膨胀,定义为图像f中与 b ^ \hat b b^重合区域的最大值,即
[ f ⊕ b ] ( x , y ) = m a x ( s , t ) ∈ b { f ( x − s , y − t ) } [f⊕b](x,y)=max_{(s,t)∈b}\{ f(x-s,y-t) \} [fb](x,y)=max(s,t)b{f(xs,yt)}

9.6.2 开操作和闭操作

灰度级图像的开操作和闭操作的表达式与二值图像的对应操作具有相同的形式。结构元b对图像f的开操作表示为f∘b,即:

f ∘ b = ( f ⊖ b ) ⊕ b f ∘ b = (f ⊖ b)⊕b fb=(fb)b
像之前那样,开操作先只用b对f做腐蚀,随后用b对所得结果做膨胀。类似地,b对f的闭操作表示为f·b,即
f ⋅ b = ( f ⊕ b ) ⊖ b f·b = (f ⊕ b)⊖b fb=(fb)b
灰度级图像的开操作和闭操作关于函数的补集和结构元的反射是对偶的:
( f ⋅ b ) c = f c ∘ b ^ (f·b)^c=f^c ∘ \hat b (fb)c=fcb^
( f ∘ b ) c = f c ⋅ B ^ (f∘b)^c=f^c·\hat B (fb)c=fcB^
因为 f c = − f ( x , y ) f^c=-f(x,y) fc=f(x,y),所以也可以写为 − ( f ⋅ b ) = ( − f ∘ b ^ ) -(f·b)=(-f∘\hat b) (fb)=(fb^)

9.6.3 一些基本的灰度级形态学算法

形态学平滑
因为开操作抑制比结构元小的亮细节,而闭操作抑制暗细节,所以以形态滤波的形式结合起来用于图像平滑和噪声去除。
形态学梯度
膨胀和腐蚀可与图像相减结合起来得到一幅图像的形态学梯度,在这里,由g来定义:
g = ( f ⊕ b ) − ( f ⊖ b ) g=(f⊕b)-(f⊖b) g=(fb)(fb)

膨胀粗化一幅图像中的区域,而腐蚀则细化它们。膨胀和腐蚀的差强调了区域间的边界。同质区域不受影响,因此相减操作趋于消除同质区域。最终结果是是边缘被增强而同质区域的贡献被抑制掉了的图像。

膨胀粗化一幅图像中的区域,而腐蚀则细化它们。膨胀和腐蚀的差强调了区域间的边界。同质区域不受影响(只要 SE 相对较小),因此相减操作趋于消除同质区域。最终结果是是边缘被增强而同质区域的贡献被抑制掉了的图像。

顶帽变换和底帽变换

这些变换的主要应用之一是,用一个结构元通过开操作或闭操作从一幅图像中删除物体,而不是拟合被删除的物体。然后,差操作得到一幅仅保留已删除分量的图像。顶帽变换用于暗背景上的亮物体,而底帽变换则用于相反的情况。

粒度测定

在图像处理方面,粒度测定是属于判断图像中颗粒的尺寸分布的领域。

纹理分割
目的是以纹理内容为基础找到两个区域的边界。

9.6.4 灰度级形态学重建

灰度级形态学重建基本上按照与9.5.9节针对二值图像所介绍的相同的方法来定义。令f和g分别代表标记图像和模板图像。我们假设f和g是大小相同的灰度级图像,且f≤g。f关于g的大小为1的测地膨胀定义为
D g ( 1 ) ( f ) = ( f ⊕ b ) ∧ g D^{(1)}_g(f)=(f⊕b) ∧ g Dg(1)(f)=(fb)g

其中∧代表点方式的最小算子。大小为1的测地膨胀是由先计算b对f的膨胀,然后选泽在每一个(x,y)点处该结果和g间的最小者。根据b为平坦结构元还是非平坦结构元,膨胀的计算公式不同。
f关于g的大小为n的测地膨胀为:
D g ( n ) ( f ) = D g ( 1 ) [ D g ( n − 1 ) ( f ) ] D^{(n)}_g(f)=D^{(1)}_g[D^{(n-1)}_g(f)] Dg(n)(f)=Dg(1)[Dg(n1)(f)]
D g ( 0 ) ( f ) = f D^{(0)}_g(f)=f Dg(0)(f)=f

类似地,f关于g的大小为1的测地腐蚀定义为
E g ( 1 ) ( f ) = ( f ⊖ b ) ∨ g E^{(1)}_g(f)=(f⊖b)∨g Eg(1)(f)=(fb)g
式中,∨代表点方式的最大算子。f关于g的大小为n的测地腐蚀为:
E g ( n ) ( f ) = E g ( 1 ) [ E g ( n − 1 ) ( f ) ] E^{(n)}_g(f)=E^{(1)}_g[E^{(n-1)}_g(f)] Eg(n)(f)=Eg(1)[Eg(n1)(f)]
并有
E g ( 0 ) ( f ) = f E^{(0)}_g(f)=f Eg(0)(f)=f

灰度级标记图像f对灰度级模板图像g的膨胀形态学重建,定义为f关于g的测地膨胀反复迭代,直至达到稳定;即
R g D ( f ) = D g ( k ) ( f ) R^D_g(f)=D^{(k)}_g(f) RgD(f)=Dg(k)(f)
且k应使 D g ( k ) ( f ) = D g ( k + 1 ) ( f ) D^{(k)}_g(f)=D^{(k+1)}_g(f) Dg(k)(f)=Dg(k+1)(f),f对g的腐蚀的形态学重建类似地定义为
R g E ( f ) = E g ( k ) ( f ) R^E_g(f)=E^{(k)}_g(f) RgE(f)=Eg(k)(f)
且k应使 E g ( k ) ( f ) = E g ( k + 1 ) ( f ) E^{(k)}_g(f)=E^{(k+1)}_g(f) Eg(k)(f)=Eg(k+1)(f)

如在二值情况那样,灰度级图像重建的开操作首先腐蚀输入图像,并用它作为标记图像。一幅图像f的大小为n的重建开操作定义为先对f进行大小为n的腐蚀,再由f的膨胀重建;即
O R ( n ) ( f ) = R f D [ ( f ⊖ n b ) ] O^{(n)}_R(f)=R^{D}_f[(f⊖nb)] OR(n)(f)=RfD[(fnb)]
类似地,图像f的大小为n的重建闭操作定义为先对f进行大小为n的膨胀,再由f的腐蚀重建;即
C R ( n ) ( f ) = R f E [ ( f ⊕ n b ) ] C^{(n)}_R(f)=R^{E}_f[(f⊕nb)] CR(n)(f)=RfE[(fnb)]

因为对偶性,图像的重建闭操作可以用图像的求补得到,先得到重建开操作,然后再求结果的补。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值