0
点赞
收藏
分享

微信扫一扫

【youcans 的 OpenCV 例程200篇】139. 灰度顶帽变换校正阴影


【youcans 的 OpenCV 例程200篇】139. 灰度顶帽变换校正阴影


灰度级形态学将形态学操作从二值图像扩展到灰度图像。灰度形态学处理也有腐蚀、膨胀、开运算、闭运算、顶帽操作、低帽操作等操作,可以实现图像平滑、图像增强、图像分割功能。

把图像像素点的灰度值视为高度,不同的灰度级表示不同的高度,整个图像就像一张高低起伏的地形图。明亮的区域(灰度值大)相当于高山,黑暗的区域(灰度值小)相当于深谷,边缘区域即明亮与黑暗的交界相当于悬崖。


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(fb)=f(fb)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)=fbf=(fb)bf

闭运算可以删除亮背景下的暗区域,底帽变换可以得到原图中的暗区域,因此又称黑底帽变换。

OpenCV 中的函数 cv.morphologyEx 可以实现图像的顶帽运算和底帽运算,参数 op 则要分别设为 MORPH_TOPHAT、MORPH_BLACKHAT。


例程 10.30:灰度顶帽变换校正阴影

均匀光照对于从背景中提取目标十分重要,顶帽变换的重要用途就是校正不均匀光照的影响。

本例图像是在非均匀光照条件下拍摄的,图像底部和右侧的暗色区域比较明显。

如果直接用 Otsu 最优阈值处理方法对灰度图像进行二值化处理,在暗区域的分割出现错误,一些米粒未能从背景中提取出来,而在左上角的亮区域则把部分背景理解为米粒。

我们可以先对图像进行顶帽运算,减弱图像中亮端和暗端的差别,再用 Otsu 最优阈值处理方法进行二值化处理,就可以得到正确的阈值处理结果。

    # 10.30: 灰度顶帽变换校正阴影
    imgGray = cv2.imread("../images/Fig0940a.tif", flags=0)  # flags=0 灰度图像

    # 直接用 Otsu 最优阈值处理方法进行二值化处理
    ret, imgBin = cv2.threshold(imgGray, 127, 255, cv2.THRESH_OTSU)  # 二值化处理,黑色背景

    # 顶帽运算后再用 Otsu 最优阈值处理方法进行二值化处理
    element = cv2.getStructuringElement(cv2.MORPH_CROSS, (50, 50))  # 十字交叉结构元
    imgThat = cv2.morphologyEx(imgGray, cv2.MORPH_TOPHAT, element)  # 顶帽运算
    ret, imgThatBin = cv2.threshold(imgThat, 127, 255, cv2.THRESH_OTSU)  # 二值化处理,黑色背景

    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 binary"), plt.axis('off')
    plt.imshow(imgBin, cmap='gray', vmin=0, vmax=255)
    plt.subplot(223), plt.title("Tophat image"), plt.axis('off')
    plt.imshow(imgThat, cmap='gray', vmin=0, vmax=255)
    plt.subplot(224), plt.title("Tophat binary"), plt.axis('off')
    plt.imshow(imgThatBin, cmap='gray', vmin=0, vmax=255)
    plt.tight_layout()
    plt.show()

在这里插入图片描述


(本节完)


版权声明:

youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123565771)

Copyright 2022 youcans, XUPT
Crated:2022-3-24


举报

相关推荐

0 条评论