【youcans 的 OpenCV 例程200篇】141. 灰度底帽变换的三维地形图
5.3 灰度顶帽变换和灰度底帽运算
图像相减结合开运算和闭运算,就得到顶帽变换和底帽变换。
灰度图像 f 的顶帽变换定义为原图像减去图像开运算结果:
T
h
a
t
(
f
)
=
f
−
(
f
∘
b
)
=
f
−
(
f
⊖
b
)
⊕
b
T_{hat}(f) = f - (f \circ b) = f - (f \ominus b) \oplus b
That(f)=f−(f∘b)=f−(f⊖b)⊕b
开运算可以删除暗背景下的亮区域,顶帽变换可以得到原图中的亮区域,因此又称白顶帽变换。
类似地,灰度图像 f 的低帽变换定义为图像闭运算结果减去原图像:
B h a t ( f ) = f ∙ b − f = ( f ⊕ b ) ⊖ b − f B_{hat}(f) = f \bullet b - f = (f \oplus b) \ominus b - f Bhat(f)=f∙b−f=(f⊕b)⊖b−f
闭运算可以删除亮背景下的暗区域,底帽变换可以得到原图中的暗区域,因此又称黑底帽变换。
OpenCV 中的函数 cv.morphologyEx 可以实现图像的顶帽运算和底帽运算,参数 op 则要分别设为 MORPH_TOPHAT、MORPH_BLACKHAT。
例程 10.32:灰度底帽变换的三维地形图
均匀光照对于从背景中提取目标十分重要。类似地,底帽变换的重要用途也是校正不均匀光照的影响,可以用于删除亮背景下的暗区域,从而得到原图中的暗区域。
# 10.32: 灰度底帽变换的三维地形图
imgGray = cv2.imread("../images/imgHat01.png", flags=0) # flags=0 灰度图像
# 闭运算
element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25)) # 圆形结构元
imgClose = cv2.morphologyEx(imgGray, cv2.MORPH_CLOSE, element) # 闭运算
# 底帽运算
element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (55, 55)) # 圆形结构元
imgBhat = cv2.morphologyEx(imgGray, cv2.MORPH_BLACKHAT, element) # 底帽运算
fig = plt.figure(figsize=(10, 6))
plt.subplot(231), plt.title("Origin"), plt.axis('off')
plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255)
plt.subplot(232), plt.title("Closing image"), plt.axis('off')
plt.imshow(imgClose, cmap='gray', vmin=0, vmax=255)
plt.subplot(233), plt.title("Blackhat image"), plt.axis('off')
plt.imshow(imgBhat, cmap='gray', vmin=0, vmax=255)
h = np.arange(0, imgGray.shape[1])
w = np.arange(0, imgGray.shape[0])
xx, yy = np.meshgrid(h, w) # 将一维数组 xnew, ynew 转换为网格点集(二维数组)
ax1 = plt.subplot(234, projection='3d')
ax1.plot_surface(xx, yy, imgGray, rstride=1, cstride=1, cmap='coolwarm', linewidth=0)
ax1.set_xticks([]), ax1.set_yticks([]), ax1.set_zticks([])
ax2 = plt.subplot(235, projection='3d')
ax2.plot_surface(xx, yy, imgClose, rstride=1, cstride=1, cmap='coolwarm', linewidth=0)
ax2.set_xticks([]), ax2.set_yticks([]), ax2.set_zticks([])
ax3 = plt.subplot(236, projection='3d')
ax3.plot_surface(xx, yy, imgBhat, rstride=1, cstride=1, cmap='coolwarm', linewidth=0)
ax3.set_xticks([]), ax3.set_yticks([]), ax3.set_zticks([])
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123565948)
Copyright 2022 youcans, XUPT
Crated:2022-3-24