数字图像处理 第九章——形态学图像处理

1 腐蚀和膨胀

1.1 腐蚀

作为 Z 2 Z^2 Z2中的集合A和B,表示为 A ⊖ B A\ominus B AB的B对A的腐蚀定义为:
A ⊖ B = { z ∣ ( B ) z ⊆ A } A\ominus B=\{z|(B)_z\subseteq A\} AB={z(B)zA}
通俗来讲是一个用z平移的B包含在A中所有的点z的集合。B必须包含在A中,B不与背景共享任何公共元素,也可以表示为 A ⊖ B = { z ∣ ( B ) z ∩ A c = ⊘ } A\ominus B=\{z|(B)_z\cap A^c=\oslash \} AB={z(B)zAc=},其中 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 AB的B对A的膨胀定义为:
A ⊕ B = { z ∣ ( B ~ ) z ∩ A ≠ ⊘ } A\oplus B=\{z|(\tilde B)_z\cap A\ne \oslash \} AB={z(B~)zA=}
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 \} AB={z[(B~)zA]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 AB=(AB)B,B对A的开操作就是B对A的腐蚀,然后用B对结果进行膨胀。

结构元B对集合A的闭操作,表示为 A ∙ B = ( A ⊕ B ) ⊖ B A\bullet B=(A\oplus B)\ominus B AB=(AB)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)] AB=(AD)[Ac(WD)]
A ⋆ B = ( A ⊖ B 1 ) ∩ ( A c ⊖ B 2 ) A\star B=(A\ominus B_1)\cap (A^c\ominus B_2) AB=(AB1)(AcB2)
A ⋆ B = ( A ⊖ B 1 ) ∩ ( A c ⊕ B ~ 2 ) A\star B=(A\ominus B_1)\cap (A^c\oplus \tilde B_2) AB=(AB1)(AcB~2)
在这里插入图片描述

2 形态学算法

  • 边界提取
    先用B对A进行腐蚀,腐蚀的结果是A的边界被“消除 ”,再用A的原图减去被腐蚀的A,就得到了被腐蚀的边界。
    β ( A ) = A − ( A ⊖ B ) \beta (A)=A-(A\ominus B) β(A)=A(AB)

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=(Xk1B)Ac

  • 连通分量的提取
    每一个连通分量就是一个物体,识别出图像中各个物体,就是要提取出一个个连通分量。
    X k = ( X k − 1 ⊕ B ) ∩ A X_k=(X_{k-1}\oplus B)\cap A Xk=(Xk1B)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=(XK1Bi)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=Xk1i,令 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 AB,可以根据击中或击不中变换定义:
    A ⊗ B = A − ( A ⋆ B ) = A ∩ ( A ⋆ B ) c A\otimes B=A-(A\star B)=A\cap(A\star B)^c AB=A(AB)=A(AB)c

  • 粗化
    细化的形态学对偶,定义为:
    A ∙ B = A ∪ ( A ⋆ B ) A\bullet B=A\cup(A\star B) AB=A(AB)
    粗化集合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)=(AkB)(AkB)B
    A ⊖ k B A\ominus kB AkB表示对A的连续k次腐蚀。

  • 裁剪
    细化和骨架提取过程中会保留某些寄生分量,裁剪就是来清楚这些寄生分量的,用于去除毛刺。

  • 形态学重建
    涉及两幅图像和一个结构元,一幅图像是标记,包含变换的起始点,另一幅图像是模板,约束该变换。结构元用来定义连接性。将一个结构元在图像中进行膨胀或腐蚀操作。

3 灰度级形态学

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

  • 形态学平滑
    开操作抑制比结构元小的亮细节,闭操作抑制暗细节,通过开闭操作实现图像平滑和噪声去除。

  • 形态学梯度
    腐蚀和膨胀可与图像相减结合起来得到一幅图像的形态学梯度 g = ( f ⊕ b ) − ( f ⊖ b ) g=(f\oplus b)-(f\ominus b) g=(fb)(fb)。膨胀是粗化图像中的区域,腐蚀是细化图像中的区域,两者相减则得到了区域的边界。

  • 顶帽变换和底帽变换
    图像相减与开操作与闭操作相结合,会产生所谓的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(fb)
    灰度级图像 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)=(fb)f

  • 粒度测定
    判断图像中颗粒的尺寸分布。对于比背景亮且具有规则形状的颗粒,该方法由使用逐渐增大的结构元对图像执行开操作组成。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值