【youcans 的 OpenCV 例程200篇】129. 形态算法之骨架 (重建开运算)
3. 形态学算法
形态学处理的主要应用是提取图像中用来表示和描述形状的元素和成分,例如提取边界、连通分量、凸壳和区域骨架。
### 3.7 骨架
形态骨架(morphological skeleton)是一种细化的结构,指图像的骨骼部分,用于描述物体的几何形状和拓扑结构,是目标物体重要的拓扑描述。图像的细化是对二值图像进行骨架提取,删除不需要的轮廓点,只保留其骨架点。
骨架可以用腐蚀和开运算来表示,,可以用重建开运算来实现。
S
(
A
)
=
⋃
k
=
0
K
S
k
(
A
)
S
k
(
A
)
=
(
A
⊖
k
B
)
−
(
A
⊖
k
B
)
∘
B
S(A) = \bigcup ^K_{k=0} S_k(A)\\ S_k(A) = (A \ominus kB) - (A \ominus kB) \circ B
S(A)=k=0⋃KSk(A)Sk(A)=(A⊖kB)−(A⊖kB)∘B
按照以上思路,构造骨骼化算法的步骤:
(1)对图像进行腐蚀,腐蚀后的物体变得更窄细;
(2)对腐蚀后图像做开运算,开运算处理时被删除的像素就是骨骼的一部分,将其加入骨骼图像;
(3)重复以上过程,直到图像被完全腐蚀。
例程 10.18:形态算法之提取骨架
# 10.18:形态算法之提取骨架 (重建开运算)
imgGray = cv2.imread("../images/handwriting05.png", flags=0) # flags=0 灰度图像
ret, imgBin = cv2.threshold(imgGray, 127, 255, cv2.THRESH_BINARY) # 二值化处理
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
skeleton = np.zeros(imgBin.shape, np.uint8) # 创建空骨架图
while True:
imgOpen = cv2.morphologyEx(imgBin, cv2.MORPH_OPEN, element) # 开运算
subSkel = cv2.subtract(imgBin, imgOpen) # 获得骨架子集
skeleton = cv2.bitwise_or(skeleton, subSkel) # # 将删除的像素添加到骨架图
imgBin = cv2.erode(imgBin, element) # 腐蚀,用于下一次迭代
if cv2.countNonZero(imgBin) == 0:
break
plt.figure(figsize=(9, 6))
plt.subplot(131), plt.axis('off'), plt.title("origin")
plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255)
plt.subplot(132), plt.title("eroded completely"), plt.axis('off')
plt.imshow(imgBin, cmap='gray', vmin=0, vmax=255)
plt.subplot(133), plt.title("skeleton"), plt.axis('off')
plt.imshow(skeleton, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123498059)
Copyright 2022 youcans, XUPT
Crated:2022-3-15