0
点赞
收藏
分享

微信扫一扫

【youcans 的 OpenCV 例程200篇】142. 基于灰度形态学的图像平滑


【youcans 的 OpenCV 例程200篇】142. 基于灰度形态学的图像平滑


5.4 灰度形态学之图像平滑

由于开运算和闭运算对亮细节和暗细节的抑制作用,对图像先后做开运算和闭运算可以有效地抑制细节,实现平滑图像和去除噪声。

使用开运算和闭运算做形态平滑,就是循环交替地执行开运算和闭运算的操作。

把图像像素点的灰度值视为高度,整个图像就像一张高低起伏的地形图。形态学平滑就是不断地挖掉高峰、填平低谷,因此起到了平整地形的功效。

通过开运算、闭运算的交替操作实现形态学平滑,可以定义为:

M s m o o t h ( f ) = ( f ∘ g b ) ∙ g b M_{smooth}(f) = (f \circ _g b) \bullet _g b Msmooth(f)=(fgb)gb


例程 10.33:基于灰度形态学的图像平滑

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

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

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

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

    # 10.33: 基于灰度形态学的图像平滑
    imgGray = cv2.imread("../images/Fig0938a.tif", flags=0)  # flags=0 灰度图像

    # 用不同半径圆形结构元依次交替进行开运算-闭运算实现图像平滑
    kSize = (2, 2)
    element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, kSize)  # 圆形结构元
    imgOpen1 = cv2.morphologyEx(imgGray, cv2.MORPH_OPEN, element)  # 灰度开运算
    imgClose1 = cv2.morphologyEx(imgOpen1, cv2.MORPH_CLOSE, element)  # 灰度闭运算
    imgIter = imgGray.copy()  # 循环交替进行开运算-闭运算
    for i in range(10):
        imgIter = cv2.morphologyEx(imgIter, cv2.MORPH_OPEN, element)
        imgIter = cv2.morphologyEx(imgIter, cv2.MORPH_CLOSE, element)

    plt.figure(figsize=(10, 6))
    plt.subplot(131), plt.title("Origin"), plt.axis('off')
    plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255)
    plt.subplot(132), plt.title("Opening-closing (ksize=2)"), plt.axis('off')
    plt.imshow(imgClose1, cmap='gray', vmin=0, vmax=255)
    plt.subplot(133), plt.title("Opening-closing (iter=10)"), plt.axis('off')
    plt.imshow(imgIter, cmap='gray', vmin=0, vmax=255)
    plt.tight_layout()
    plt.show()

在这里插入图片描述


(本节完)


版权声明:

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

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


举报

相关推荐

0 条评论