当前位置:   article > 正文

opencv(28) 直方图之二:直方图均衡化_opencv 直方图均衡

opencv 直方图均衡

1 原理

直方图均衡化就是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。直方图均衡化的中心思想是把原始图像的的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布。

在一幅图像中,明亮图像的直方图倾向于灰度级高的一侧,灰暗图像的直方图倾向于灰度级低的一侧,如果一副图像占有全部可能的灰度级并且分布均匀,则这样的图像有高对比度和多变的灰度色调。直方图均衡化这种方法通常用来增加图像的局部对比度。所以这种方法对于图像前景和背景都太亮或者太暗的情况非常有用,使目标区域从背景脱离出来。

直方图均衡化:一般可以用来提升图片的亮度,频数均衡化指的是让频数的分布看起来更加均匀一些。

上图中的左边的图是原始数据, 右边的图是进行函数映射后的灰度值

首先对各个灰度值做频数统计,计算其概率,根据像素的灰度值计算出累积概率,最后将累积概率 * (255-0) 做为函数映射后的灰度值,

这样做的目的,可以使得灰度值之间的间隔更小,即一些频数较大的灰度值补充给了频数较小的灰度值,从而实现了灰度值的均衡化。

2 相关函数

2.1 cv2.equalizeHist() 完整图像直方图均衡化

函数原型:result=cv2.equalizeHist(iamge)

参数:

  1. image 输入的图片

2.2 cv2.createCLAHE() 自适应图像直方图均衡化

函数原型:cv2.createCLAHE(clipLimit=8.0,titleGridSize=(8,8))

参数:

  1. clipLimit颜色对比度的阈值
  2. titleGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作

 3 颜色直方图均衡化的步骤

上述函数都是对灰度图的均衡化,如何对彩色图实现均衡化?

  1. 使用 cv2.split() 分割 BGR 图像
  2. 并将 cvequalizeHist() 函数应用于每个通道,
  3. 最后,使用 cv2.merge() 合并结果通道

4  示例1:cv2.equalizeHist() 完整图像直方图均衡化

"""
第一步:读入图片
第二步:使用cv2.equalizeHist(img)均衡化像素
第三步:使用plt.hist 画出均衡化的直方图
第四步:使用plt.imshow 画出均衡化后的图像
这种全局的均衡化也会存在一些问题,由于整体亮度的提升,也会使得
局部图像的细节变得模糊,因为我们需要进行分块的局部均衡化操作
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 【解决plt显示汉字乱码的临时设置】
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
 
# 【第一步:读入图片】
img = cv2.imread('C:/Users/xxx/Downloads/lena.jpg')
img = cv2.merge((img[:,:,2],img[:,:,1],img[:,:,0]))

imgR,imgG,imgB =cv2.split(img)
 
# 【第二步: 使用cv2.equalizeHist实现像素点的均衡化】
retR = cv2.equalizeHist(imgR)
retG = cv2.equalizeHist(imgG)
retB = cv2.equalizeHist(imgB)
ret = cv2.merge([retR,retG,retB])
 
# 【第三步:使用plt.hist绘制像素直方图和图像显示】
# 【绘制原图】
fig = plt.figure(figsize=(25.6,4.8))
plt.subplot(1,4,1),plt.imshow(img)
plt.title('原图',fontsize=20), plt.xticks([]), plt.yticks([])


# 【绘制直方图均衡化后的图像】
plt.subplot(1,4,3),plt.imshow(ret)
plt.title('直方图均衡化',fontsize=20), plt.xticks([]), plt.yticks([])


# 【绘制原图的R,G,B直方图】
plt.subplot(1,4,2)
plt.title('R,G,B 原图直方图',fontsize=20)
color =('r','g','b')
for i,c in enumerate(color):
    hist = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(hist,color=c)
    plt.xlim([0,256])


# 【绘制直方图均衡化后的图像的R,G,B直方图】
plt.subplot(1,4,4)
plt.title('R,G,B 均衡化后直方图',fontsize=20)
color =('r','g','b')
for i,c in enumerate(color):
    hist = cv2.calcHist([ret],[i],None,[256],[0,256])
    plt.plot(hist,color=c)
    plt.xlim([0,256])

 运行结果如下:

5 示例2:cv2.createCLAHE()自适应图像直方图均衡化 

"""
第一步:使用cv2.createCLAHE(clipLimit=2.0, titleGridSize=(8, 8)) 实例化均衡直方图函数
第二步:使用.apply进行均衡化操作
第三步:进行画图操作
可以看出自适应均衡化没有使得人物脸部的细节消失
"""

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 【读入图片】
img = cv2.imread('C:/Users/xxx/Downloads/lina.jpeg')
img = cv2.merge((img[:,:,2],img[:,:,1],img[:,:,0]))

imgR,imgG,imgB =cv2.split(img)

# 【使用自适应直方图均衡化
# 【第一步:实例化自适应直方图均衡化函数】
clahe = cv2.createCLAHE(clipLimit=2.0,
                        tileGridSize=(8, 8))
 
# 【第二步:进行自适应直方图均衡化】
retR = clahe.apply(imgR)
retG = clahe.apply(imgG)
retB = clahe.apply(imgB)
ret = cv2.merge([retR,retG,retB])

# 【第三步:使用plt.hist绘制像素直方图和图像显示】


# 【绘制原图】
fig = plt.figure(figsize=(25.6,4.8))
plt.subplot(1,4,1),plt.imshow(img)
plt.title('原图',fontsize=20), plt.xticks([]), plt.yticks([])


# 【绘制直方图均衡化后的图像】
plt.subplot(1,4,3),plt.imshow(ret)
plt.title('直方图均衡化',fontsize=20), plt.xticks([]), plt.yticks([])


# 【绘制原图的R,G,B直方图】
plt.subplot(1,4,2)
plt.title('R,G,B 原图直方图',fontsize=20)
color =('r','g','b')
for i,c in enumerate(color):
    hist = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(hist,color=c)
    plt.xlim([0,256])


# 【绘制直方图均衡化后的图像的R,G,B直方图】
plt.subplot(1,4,4)
plt.title('R,G,B 均衡化后直方图',fontsize=20)
color =('r','g','b')
for i,c in enumerate(color):
    hist = cv2.calcHist([ret],[i],None,[256],[0,256])
    plt.plot(hist,color=c)
    plt.xlim([0,256])

plt.show()

运行结果如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/141175?site
推荐阅读
相关标签
  

闽ICP备14008679号