1 腐蚀和膨胀
1.1 腐蚀
作为
Z
2
Z^2
Z2中的集合A和B,表示为
A
⊖
B
A\ominus B
A⊖B的B对A的腐蚀定义为:
A
⊖
B
=
{
z
∣
(
B
)
z
⊆
A
}
A\ominus B=\{z|(B)_z\subseteq A\}
A⊖B={z∣(B)z⊆A}
通俗来讲是一个用z平移的B包含在A中所有的点z的集合。B必须包含在A中,B不与背景共享任何公共元素,也可以表示为
A
⊖
B
=
{
z
∣
(
B
)
z
∩
A
c
=
⊘
}
A\ominus B=\{z|(B)_z\cap A^c=\oslash \}
A⊖B={z∣(B)z∩Ac=⊘},其中
A
c
A^c
Ac是A的补集。
腐蚀缩小细化了二值图像中的物体。可以看成是形态学滤波操作,将小于结构元的图像细节从图像中滤除。
import cv2
import numpy as np
#读入图像
img = cv2.imread(‘c:\jimei.jpg’, cv2.IMREAD_GRAYSCALE)# 定义结构元素
kernel = np.ones((5,5), np.uint8)
#执行腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1)
#显示结果
cv2.namedWindow(‘img’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘img’, 800, 600)
cv2.namedWindow(‘corrode’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘corrode’, 800, 600)
cv2.imshow(‘img’,img)
cv2.imshow(‘corrode’,erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 膨胀
作为
Z
2
Z^2
Z2中的集合A和B,表示为
A
⊕
B
A\oplus B
A⊕B的B对A的膨胀定义为:
A
⊕
B
=
{
z
∣
(
B
~
)
z
∩
A
≠
⊘
}
A\oplus B=\{z|(\tilde B)_z\cap A\ne \oslash \}
A⊕B={z∣(B~)z∩A=⊘}
B关于它的原点的映像,并且以z对映像进行平移为基础的。B对A的膨胀是所有位移z的集合。
B
~
\tilde B
B~与A至少有一个元素是重叠的。公式可写为:
A
⊕
B
=
{
z
∣
[
(
B
~
)
z
∩
A
]
⊆
A
}
A\oplus B=\{z|[(\tilde B)_z\cap A]\subseteq A \}
A⊕B={z∣[(B~)z∩A]⊆A}
膨胀以集合操作为基础,是非线性操作,卷积是线性操作。
膨胀“增长粗化”二值图像中的物体,粗化的宽度由结构元控制。
import cv2
import numpy as np
#读入图像
img = cv2.imread(‘c:\jimei.jpg’, cv2.IMREAD_GRAYSCALE)
#定义结构元素
kernel = np.ones((5,5), np.uint8)
#执行膨胀操作
erosion = cv2.dilate(img, kernel, iterations=1)
#显示结果
cv2.namedWindow(‘img’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘img’, 800, 600)
cv2.namedWindow(‘expand’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘expand’, 800, 600)
cv2.imshow(‘img’,img)
cv2.imshow(‘expand’,erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.3 对偶性
B对A的腐蚀是 B ~ \tilde B B~对 A c A^c Ac的膨胀的补,反之亦然。结构元关于其原点对称时,对偶性就很有用了。
1.4 开操作和闭操作
开操作一般会平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。闭操作同样也会平滑轮廓的一部分,但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮线中的断裂。
结构元B对集合A的开操作,表示为 A ∘ B = ( A ⊖ B ) ⊕ B A\circ B=(A\ominus B)\oplus B A∘B=(A⊖B)⊕B,B对A的开操作就是B对A的腐蚀,然后用B对结果进行膨胀。
结构元B对集合A的闭操作,表示为 A ∙ B = ( A ⊕ B ) ⊖ B A\bullet B=(A\oplus B)\ominus B A∙B=(A⊕B)⊖B,B对A的闭操作就是B对A的膨胀,然后用B对结果进行腐蚀。
开操作代码:
import cv2
import numpy as np
#读入图像
img = cv2.imread(‘d:\kai1.png’, cv2.IMREAD_GRAYSCALE)
#定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
opened1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel,iterations=3)
#显示结果
cv2.namedWindow(‘img’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘img’, 800, 600)
cv2.namedWindow(‘result’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘result’, 800, 600)
cv2.imshow(‘img’,img)
cv2.imshow(‘result’,opened1)
cv2.waitKey(0)
cv2.destroyAllWindows()
闭操作代码
import cv2
import numpy as np
#读入图像
img = cv2.imread(‘c:\he.png’, cv2.IMREAD_GRAYSCALE)
#定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel,iterations=3) #闭运算1
#显示结果
cv2.namedWindow(‘img’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘img’, 800, 600)
cv2.namedWindow(‘result’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘result’, 800, 600)
cv2.imshow(‘img’,img)
cv2.imshow(‘result’,closed)
cv2.waitKey(0)
cv2.destroyAllWindows()
结论:图像内的断点明显被弥合了。
1.5 击中或击不中变换
下列三个公式称为形态学击中或击不中变换
A
⋆
B
=
(
A
⊖
D
)
∩
[
A
c
⊖
(
W
−
D
)
]
A\star B=(A\ominus D)\cap [A^c\ominus (W-D)]
A⋆B=(A⊖D)∩[Ac⊖(W−D)]
A
⋆
B
=
(
A
⊖
B
1
)
∩
(
A
c
⊖
B
2
)
A\star B=(A\ominus B_1)\cap (A^c\ominus B_2)
A⋆B=(A⊖B1)∩(Ac⊖B2)
A
⋆
B
=
(
A
⊖
B
1
)
∩
(
A
c
⊕
B
~
2
)
A\star B=(A\ominus B_1)\cap (A^c\oplus \tilde B_2)
A⋆B=(A⊖B1)∩(Ac⊕B~2)
2 形态学算法
- 边界提取
先用B对A进行腐蚀,腐蚀的结果是A的边界被“消除 ”,再用A的原图减去被腐蚀的A,就得到了被腐蚀的边界。
β ( A ) = A − ( A ⊖ B ) \beta (A)=A-(A\ominus B) β(A)=A−(A⊖B)
import cv2
import numpy as np
#读入图像
img = cv2.imread(‘c:\he.png’, cv2.IMREAD_GRAYSCALE)
#定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
dilate_img = cv2.dilate(img, kernel)
erode_img = cv2.erode(img, kernel)
absdiff_img = cv2.absdiff(dilate_img,erode_img);
retval, threshold_img = cv2.threshold(absdiff_img, 40, 255, cv2.THRESH_BINARY);
result = cv2.bitwise_not(threshold_img);
#显示结果
cv2.namedWindow(‘img’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘img’, 800, 600)
cv2.namedWindow(‘result’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘result’, 800, 600)
cv2.imshow(‘img’,img)
cv2.imshow(‘result’,result)
cv2.waitKey(0)
cv2.destroyAllWindows()
-
孔洞填充
先找孔洞的一个点,用结构元去膨胀,然后用原图像的补集进行约束,求个交集,不断重复膨胀,约束直至图形不改变(就停止,与原图求个交集。
X k = ( X k − 1 ⊕ B ) ∩ A c X_k=(X_{k-1}\oplus B)\cap A^c Xk=(Xk−1⊕B)∩Ac -
连通分量的提取
每一个连通分量就是一个物体,识别出图像中各个物体,就是要提取出一个个连通分量。
X k = ( X k − 1 ⊕ B ) ∩ A X_k=(X_{k-1}\oplus B)\cap A Xk=(Xk−1⊕B)∩A -
凸壳
集合A内连接任意两个点的直线段都在A的内部,称集合A是凸形的。任何集合S的凸壳H是包含于S的最小凸集。集合差H-S称为S的凸缺。凸壳和凸缺对于物体买哦会很有用。
令 B i , i = 1 , 2 , 3 , 4 B^i,i=1,2,3,4 Bi,i=1,2,3,4表示4个结构元
X K i = ( X K − 1 ⋆ B i ) ∪ A X_K^i=(X_{K-1}\star B^i)\cup A XKi=(XK−1⋆Bi)∪A
其中 X 0 i = A X_0^i=A X0i=A当 X k i = X k − 1 i X_k^i=X_{k-1}^i Xki=Xk−1i,令 D i = X k i D^i=X_k^i Di=Xki,则A的凸壳为:
C ( A ) = ⋃ i = 1 4 D i C(A)=\bigcup_{i=1}^{4} D^i C(A)=⋃i=14Di -
细化
减少图像中的线宽,去除毛刺等干扰噪声,提高图像质量
结构元B对集合A的细化可表示为 A ⊗ B A\otimes B A⊗B,可以根据击中或击不中变换定义:
A ⊗ B = A − ( A ⋆ B ) = A ∩ ( A ⋆ B ) c A\otimes B=A-(A\star B)=A\cap(A\star B)^c A⊗B=A−(A⋆B)=A∩(A⋆B)c -
粗化
细化的形态学对偶,定义为:
A ∙ B = A ∪ ( A ⋆ B ) A\bullet B=A\cup(A\star B) A∙B=A∪(A⋆B)
粗化集合A,先形成 C = A c C=A^c C=Ac,然后细化C,最后求 C c C^c Cc。 -
骨架
骨架是指一个物体的的中心线和轴线,骨架提取的基本思想是将物体的边界向内收缩,直到物体被压缩成一条线或点。这条线或点就是物体的骨架。
A的骨架可以使用腐蚀和开操作表达,可以表示为: S ( A ) = ⋃ k = 0 K S k ( A ) S(A)=\bigcup_{k=0}^{K} S_k(A) S(A)=⋃k=0KSk(A)
其中, S k ( A ) = ( A ⊖ k B ) − ( A ⊖ k B ) ∘ B S_k(A)=(A\ominus kB)-(A\ominus kB)\circ B Sk(A)=(A⊖kB)−(A⊖kB)∘B
A ⊖ k B A\ominus kB A⊖kB表示对A的连续k次腐蚀。 -
裁剪
细化和骨架提取过程中会保留某些寄生分量,裁剪就是来清楚这些寄生分量的,用于去除毛刺。 -
形态学重建
涉及两幅图像和一个结构元,一幅图像是标记,包含变换的起始点,另一幅图像是模板,约束该变换。结构元用来定义连接性。将一个结构元在图像中进行膨胀或腐蚀操作。
3 灰度级形态学
将腐蚀,膨胀,开操作和闭操作的基本操作扩展到灰度级图像。
-
形态学平滑
开操作抑制比结构元小的亮细节,闭操作抑制暗细节,通过开闭操作实现图像平滑和噪声去除。 -
形态学梯度
腐蚀和膨胀可与图像相减结合起来得到一幅图像的形态学梯度 g = ( f ⊕ b ) − ( f ⊖ b ) g=(f\oplus b)-(f\ominus b) g=(f⊕b)−(f⊖b)。膨胀是粗化图像中的区域,腐蚀是细化图像中的区域,两者相减则得到了区域的边界。 -
顶帽变换和底帽变换
图像相减与开操作与闭操作相结合,会产生所谓的Top-hat(顶帽)变换和bottom-hat(底帽)变换。
灰度级图像 f f f顶帽变换定义为 f f f减去其开操作:
T h a t ( f ) = f − ( f ∘ b ) T_{hat}(f)=f-(f\circ b) That(f)=f−(f∘b)
灰度级图像 f f f底帽变换定义为 f f f的闭操作减去 f f f:
B h a t ( f ) = ( f ∙ b ) − f B_{hat}(f)=(f\bullet b)-f Bhat(f)=(f∙b)−f -
粒度测定
判断图像中颗粒的尺寸分布。对于比背景亮且具有规则形状的颗粒,该方法由使用逐渐增大的结构元对图像执行开操作组成。