【youcans 的 OpenCV 例程 200 篇】122. 形态算法之边界提取
3. 形态学算法
形态学处理的主要应用是提取图像中用来表示和描述形状的元素和成分,例如提取边界、连通分量、凸壳和区域骨架。
3.1 边界提取
边界提取的原理是通过对目标图像进行腐蚀和膨胀处理,比较结果图像与原图像的差别来实现。
内边界的提取可以利用图像的腐蚀处理得到原图像的一个收缩,再将收缩结果与目标图像进行异或运算,实现差值部分的提取。
集合 A 的边界
β
(
A
)
\beta (A)
β(A) 可以通过合适的结构元 B 腐蚀集合 A,然后求 A 与腐蚀结果的差集来实现:
β
(
A
)
=
A
−
(
A
⊖
B
)
\beta(A) = A -(A \ominus B)
β(A)=A−(A⊖B)
常用的结构元 B 是 3*3 的全 1 核,而 5*5 的全 1 核往往可以得到2~3个像素宽度的边界。
类似地,外边界提取先对图像进行膨胀处理,然后用膨胀结果与原目标图像进行异或运算,也就是求膨胀结果与原目标图像的差集。
例程 10.10:形态算法之边界提取
# 10.10 形态算法之边界提取
imgGray = cv2.imread("../images/imgNetrope.png", flags=0) # flags=0 读取为灰度图像
ret, imgBin = cv2.threshold(imgGray, 25, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 二值化处理
kSize = (3, 3) # 卷积核的尺寸
kernel = np.ones(kSize, dtype=np.uint8) # 生成盒式卷积核
imgErode1 = cv2.erode(imgBin, kernel=kernel) # 图像腐蚀
imgBound1 = imgBin - imgErode1 # 图像边界提取
plt.figure(figsize=(9, 5))
plt.subplot(131), plt.axis('off'), plt.title("Origin")
plt.imshow(imgBin, cmap='gray', vmin=0, vmax=255)
plt.subplot(132), plt.title("Eroded kSize=(3,3)"), plt.axis('off')
plt.imshow(imgErode1, cmap='gray', vmin=0, vmax=255)
plt.subplot(133), plt.title("Boundary extraction"), plt.axis('off')
plt.imshow(imgBound1, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123415801)
Copyright 2022 youcans, XUPT
Crated:2022-3-6