【youcans 的 OpenCV 例程200篇】140. 灰度底帽变换校正光照
灰度级形态学将形态学操作从二值图像扩展到灰度图像。灰度形态学处理也有腐蚀、膨胀、开运算、闭运算、顶帽操作、低帽操作等操作,可以实现图像平滑、图像增强、图像分割功能。
把图像像素点的灰度值视为高度,不同的灰度级表示不同的高度,整个图像就像一张高低起伏的地形图。明亮的区域(灰度值大)相当于高山,黑暗的区域(灰度值小)相当于深谷,边缘区域即明亮与黑暗的交界相当于悬崖。
5.3 灰度顶帽变换和灰度底帽运算
图像相减结合开运算和闭运算,就得到顶帽变换和底帽变换。
灰度图像 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.31:灰度底帽变换校正光照
均匀光照对于从背景中提取目标十分重要。类似地,底帽变换的重要用途也是校正不均匀光照的影响,可以用于删除亮背景下的暗区域,从而得到原图中的暗区域。
# 10.31: 灰度底帽变换
imgGray = cv2.imread("../images/imgHat01.png", flags=0) # flags=0 灰度图像
# 直接用 Otsu 最优阈值处理方法进行二值化处理
ret, imgBin = cv2.threshold(imgGray, 127, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 二值化处理,白色背景
# 底帽变换后再用 Otsu 最优阈值处理方法进行二值化处理
element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (55, 55)) # 圆形结构元
imgBhat = cv2.morphologyEx(imgGray, cv2.MORPH_BLACKHAT, element) # 底帽运算
ret, imgBhatBin = cv2.threshold(imgBhat, 50, 255, cv2.THRESH_BINARY |cv2.THRESH_OTSU) # 二值化处理,白色背景
# 圆环表面有很多黑色噪点,通过闭操作去除
element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 圆形结构元
imgSegment = cv2.morphologyEx(imgBhatBin, cv2.MORPH_CLOSE, element) # 闭运算
plt.figure(figsize=(9, 6))
plt.subplot(221), plt.title("Origin"), plt.axis('off')
plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255)
plt.subplot(222), plt.title("Otsu segment"), plt.axis('off')
plt.imshow(imgBin, cmap='gray', vmin=0, vmax=255)
plt.subplot(223), plt.title("BlackHat image"), plt.axis('off')
plt.imshow(imgBhat, cmap='gray', vmin=0, vmax=255)
plt.subplot(224), plt.title("Tophat segment"), plt.axis('off')
plt.imshow(imgSegment, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123565844)
Copyright 2022 youcans, XUPT
Crated:2022-3-24