• OpenCV直方图的原理与显示、掩膜、均衡化、自适应均衡化


    直方图在数字图像处理和计算机视觉中扮演着至关重要的角色,用于分析和改进图像的质量和对比度。OpenCV为处理直方图提供了丰富的功能和函数,包括直方图的计算、显示、掩膜、均衡化和自适应均衡化等操作。在本文中,我们将深入探讨这些操作的原理,以便更好地理解它们的作用和应用。
    直方图的原理

    直方图是一种统计工具,用于描述图像中像素值的分布情况。它以图形的方式表示不同像素值的频率或出现次数。直方图的横轴通常代表像素值,而纵轴表示该像素值的出现频率或概率。

    直方图的计算包括以下步骤:

    图像灰度化:将彩色图像转换为灰度图像,以便更容易处理。
    像素值统计:遍历图像的每个像素,将其像素值加入到相应像素值的计数器中。
    归一化:将计数器中的像素值频率转化为概率分布,通常通过除以总像素数来实现。
    
    • 1
    • 2
    • 3

    通过分析直方图,我们可以了解图像的对比度、亮度和颜色分布等信息,这对于后续的图像处理非常有用。
    直方图的显示

    直方图的显示是一种可视化工具,通过绘制直方图来呈现图像的灰度分布。在OpenCV中,可以使用Matplotlib等绘图库来显示直方图。直方图的横轴表示像素值,纵轴表示像素值的频率或概率。通过查看直方图,我们可以快速了解图像的亮度和对比度情况。
    直方图均衡化

    直方图均衡化是一种用于改善图像对比度的方法。其原理是通过重新分配像素值,使得像素值更均匀地分布在整个范围内,从而增强了图像的对比度。

    直方图均衡化的步骤包括:

    计算原始图像的直方图。
    计算累积分布函数(CDF),该函数将像素值映射到新的值。
    使用CDF将图像的每个像素值映射到均衡化后的值。
    
    • 1
    • 2
    • 3

    这一过程可使图像的整体对比度得到改善,特别是在像素值分布不均匀的情况下,对比度的提升效果显著。
    直方图均衡化的应用

    直方图均衡化在许多图像处理任务中都具有广泛的应用,包括:

    图像增强:通过提高图像的对比度,使细节更清晰可见。
    图像预处理:在图像分割、物体识别和目标跟踪等任务中,提高图像的质量。
    医学图像处理:用于改进X射线、MRI和CT扫描等医学图像。
    遥感图像处理:用于改善卫星图像和空中图像,以便更好地进行地物检测和地理信息系统(GIS)应用。
    
    • 1
    • 2
    • 3
    • 4

    直方图均衡化的局限性

    虽然直方图均衡化在许多情况下非常有效,但它也存在一些局限性:

    有可能导致噪声增加:在像素值分布较宽的图像上,均衡化可能会增加噪声的可见性。
    不适用于所有图像:对于已经有很好对比度的图像,均衡化可能不会带来明显的改善。
    均衡化是全局操作:它忽略了图像的局部特征,因此不适合所有应用。
    
    • 1
    • 2
    • 3

    直方图均衡化与自适应均衡化

    自适应均衡化是一种改进的直方图均衡化方法,它考虑了图像的局部特征。自适应均衡化的思想是将图像分成小块,并对每个小块进行均衡化,而不是对整个图像进行处理。这有助于保留图像的局部对比度,并避免全局均衡化可能引入的问题。

    自适应均衡化的步骤包括:

    将图像分成多个不重叠的区域或块。
    对每个块进行均衡化,可以使用上述直方图均衡化方法。
    最后,将所有块合并以获得自适应均衡化后的图像。
    
    • 1
    • 2
    • 3

    自适应均衡化更适合那些局部对比度差异较大的图像,但也需要更多的计算资源。
    结论

    直方图是图像处理和计算机视觉中的重要工具,用于分析和改善图像的对比度和亮度。OpenCV提供了各种直方图相关的功能,包括计算、显示、掩膜、均衡化和自适应均衡化。这些技术可以应用于许多领域,从图像增强到医学图像处理,以提高图像

    直方图

    在这里插入图片描述

    1 灰度直方图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.1直方图的绘制和计算

    在这里插入图片描述

    代码实现

    import numpy as np
    import cv2 as cv
    import matplotlib.pyplot as plt
    
    #直接以灰度图的方式读入
    
    img =cv.imread("lena.png",0)
    
    #统计灰度图
    histr = cv.calcHist([img],[0],None,[256],[0,256])
    '''
     使用 OpenCV 的 calcHist 函数计算灰度图像的直方图。calcHist 函数接受以下参数:
    [img]:需要计算直方图的图像,以列表形式传递。
    [0]:指定通道的索引,因为我们处理的是灰度图像,所以只有一个通道,索引为 0。
    None:用于指定掩码,通常不需要使用,所以设为 None。
    [256]:指定直方图的大小,这里表示直方图有 256 个 bin,范围从 0 到 255。
    [0, 256]:指定像素值的范围,这里表示所有像素值都在 0 到 255 的范围内。 
    函数的返回值 histr 是一个包含直方图统计数据的数组。
    '''
    #绘制灰度图
    plt.figure(figsize=(10,6),dpi=100)
    '''指定画布的大小为 10x6 英寸,分辨率为 100dpi。'''
    plt.plot(histr)
    '''绘制直方图,将 histr 数组作为参数传递给 plot 函数。这将绘制一个包含灰度直方图统计数据的折线图'''
    plt.grid()
    '''添加网格线,提高图像的可读性'''
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    结果展示

    在这里插入图片描述

    2 掩膜的应用

    在这里插入图片描述

    2.1代码实现`

    import  numpy as np
    import  cv2 as cv
    import  matplotlib.pyplot as plt
    
    from pylab import mpl
    
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    
    img = cv.imread("lena.png",0)
    
    #创建蒙版
    mask = np.zeros(img.shape[:2],np.uint8)    #创建一个与图像大小相同的空白蒙版,数据类型为 uint8
    mask[100:256,100:256]=255    #在蒙版上设置感兴趣区域,将其中的像素值设为 255。
    
    #掩膜
    mask_img = cv.bitwise_and(img ,img,mask=mask)  #函数对原图像和蒙版进行位与操作,得到掩膜后的图像
    #统计掩膜后图像灰度图
    mask_histr = cv.calcHist([img],[0],mask,[256],[1,256])   # 函数计算掩膜后图像的灰度直方图。这里传入了掩膜参数 mask,只统计蒙版区域内的像素
    
    #图像显示
    fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(5,4))
    axes[0,0].imshow(img,cmap=plt.cm.gray)   #在第一个子图中展示原图像,使用灰度色彩映射 plt.cm.gray
    axes[0,0].set_title("原图")
    
    axes[0,1].imshow(mask,cmap=plt.cm.gray)
    axes[0,1].set_title("蒙版数据")
    
    axes[1,0].imshow(mask_img,cmap=plt.cm.gray)
    axes[1,0].set_title("掩膜后数据")
    
    axes[1,1].plot(mask_histr)   #在第四个子图中绘制掩膜后图像的灰度直方图
    axes[1,1].grid()  #添加网格线,提高图像的可读性。
    axes[1,1].set_title("灰度直方图")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    2.2 结果展示

    在这里插入图片描述

    3 直方图均衡化

    在这里插入图片描述
    在这里插入图片描述

    它通过重新分布图像的灰度级别,使得图像中各个灰度级别的像素值在整个范围内均匀分布,从而提高图像的视觉效果。

    直方图均衡化的作用包括:

    增强图像对比度:直方图均衡化可以拉伸原始图像中各个灰度级别的像素值,使得图像中的亮度变化更加明显,从而增强了图像的对比度。

    增强细节信息:直方图均衡化能够提高图像中低对比度区域的像素值,使得细节更加清晰可见。这对于图像分析和图像识别任务非常有用。

    去除背景噪声:直方图均衡化可以调整图像的灰度级别分布,使得背景噪声的影响减小。这对于一些需要提取目标物体的应用场景非常有效。

    增强图像的视觉效果:直方图均衡化可以使图像的整体视觉效果更加鲜明、生动,提高图像的观赏性。

    3.1代码实现

    import cv2 as cv
    import numpy as np
    import matplotlib.pyplot as plt
    from pylab import mpl
    
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    
    #直接以灰度图方式读入
    img = cv.imread("lena.png",0)
    histr_1 = cv.calcHist([img],[0],None,[256],[0,256])
    
    #均衡化处理
    dst = cv.equalizeHist(img)
    
    histr_2 = cv.calcHist([dst],[0],None,[256],[0,256])
    
    #显示
    fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(5,4),dpi=100)
    
    axes[0,0].imshow(img,cmap=plt.cm.gray)
    axes[0,0].set_title("原图")
    axes[0,1].plot(histr_1)
    axes[0,1].grid()
    axes[0,1].set_title("原图-灰度直方图")
    
    axes[1,0].imshow(dst,cmap=plt.cm.gray)
    axes[1,0].set_title("均衡化结果")
    axes[1,1].plot(histr_2)
    axes[1,1].grid()
    axes[1,1].set_title("均衡化直方图")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    3.2结果展示

    在这里插入图片描述

    4自适应均衡化

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4.1 代码实现

    import matplotlib.pyplot as plt
    import numpy as np
    import cv2 as cv
    from pylab import mpl
    
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    
    img = cv.imread("lena.png",0)
    
    #创建一个自适应均衡化对象,并应用于图像
    clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8)) #clipLimit 参数指定了对比度限制,tileGridSize 参数指定了图像划分的网格大小
    cl1 = clahe.apply(img)  #将自适应均衡化应用于图像 img,并将结果保存在变量 cl1
    
    #图像显示
    fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(5,4),dpi=100)
    axes[0].imshow(img,cmap=plt.cm.gray)
    axes[0].set_title("原图")
    axes[1].imshow(cl1,cmap=plt.cm.gray)
    axes[1].set_title("自适应均衡化结果")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4.2运行结果

    在这里插入图片描述

  • 相关阅读:
    导入(excel)+导出(excel)+国际化(i18n)+
    三、Mediasoup进程通信实现的原理
    jSignature 横屏手写签名
    用于命名实体识别的模块化交互网络
    领域驱动设计:微服务的服务和数据的协作关系
    嘉一机电告诉你胶球清洗装置好不好用(附安装示意图)
    Mac安装redis详解(附图片)
    Flutter 3.19.0 版本新特性
    2022杭电多校8(总结+补题)
    解锁云原生新场景 | 云原生加速云边端一体化发展
  • 原文地址:https://blog.csdn.net/qq_53545309/article/details/133203824