直方图均衡化

直方图均衡化

1.直方图均衡化概念

直方图均衡化的总体思想:

  1. 图像直方图是反映图像像素分布的统计表,横坐标代表像素值的取值区间,纵坐标代表每一像素值在图像中的像素总数或者所占的百分比。
  2. 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。
  3. 直方图均衡化是一种简单有效的图像增强技术。根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。
  4. 直方图均衡化是将原始图像通过函数变换,调控图像的灰度分布,得到直方图分布合理的新图像,以此来调节图像亮度、增强动态范围偏小的图像的对比度。
  5. 直方图均衡化是一种经典的图像处理算法,用以改善图像的亮度和对比度。
  6. 图像直方图均衡化目的:使其原本分布集中的像素值,均衡的分布到所有可取值的范围,这样,图像就既有明亮也有灰暗,对比度和亮度就得到了改善。也就是说通过直方图均衡化对图像进行非线性拉伸,重新分配图像像素值,本质上是根据直方图对图像进行线性或非线性灰度变换。
  7. 直方图均衡化的基本思想:对图像中占比大的灰度级进行展宽,而对占比小的灰度级进行压缩,使图像的直方图分布较为均匀,扩大灰度值差别的动态范围,从而增强图像整体的对比度。
  8. 通过累积分布函数(cumulative distribution function, CDF)可以实现将原图像r的分布转换成 s 的均匀分布,累计分布函数(CDF)就是是概率密度函数(probability density function, PDF)的积分。

2.直方图均衡化实现过程

直方图均衡化实现流程
  1. 统计原始输入图像各灰度级的像素数目\(n_i, i=0, 1, 2, 3, ..., L-1\)其中L为灰度总级数。
  2. 计算原始图像直方图,即各灰度级的概率密度\(P_i(r_i)=\frac{n_i}{n}\)
  3. 计算累积分布函数, \(S_k(r_k)=\sum_{i=0}^{L-1}P_i(r_i)k=0, 1, 2,3, ..., L-1\)
  4. 计算最后的输出灰度级。\(g_k=int[(L-1)*S_k+0.5]\)表示向上取整。
  5. 修改原图像的灰度级,获得输出图像,其直方图为近似均匀分布。

3.直方图均衡化实现代码

  1. 直方图均衡处理
hist = cv.calcHist(
    [img],    # 图像列表(即使单图像也要放在列表中)
    [0],      # 要计算直方图的通道索引(灰度图用[0],BGR彩色图可用[0][1][2]组合)
    None,     # 掩膜(None表示全图)
    [256],    # 直方图区间数(把0-255分成256个bin)
    [0, 256]  # 像素值范围(注意结束值256是取不到的)
)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False

img = cv.imread("lena.png",cv.IMREAD_GRAYSCALE) # 读入灰度图
hist=cv.calcHist([img],[0],None,[256],[0,256])
plt.figure()
plt.title("灰度图像图像直方图")
plt.xlabel("Bins像素值的取值区间")
plt.ylabel("每一像素值在图像中的像素总数")
plt.plot(hist)
plt.xlim([0,256])
plt.show()
结果显示图
  1. 灰度图直方图均衡化实列
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False

img = cv.imread("lena.png",cv.IMREAD_GRAYSCALE) # 读入灰度图
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()
hist=cv.calcHist([img],[0],None,[256],[0,256])
plt.figure()
plt.title("灰度图像图像直方图")
# 原直方图部分修改
plt.xlabel("Bins像素值的取值区间")
plt.ylabel("每一像素值在图像中的像素总数")
x = range(256)
plt.bar(x, hist.ravel(), width=1.0, alpha=0.7)  # 添加x轴位置、展平直方图数据
plt.xlim([0,256])


equalized_img = cv.equalizeHist(img)
cv.imshow("equalized_img",equalized_img)
cv.waitKey(0)
cv.destroyAllWindows()
equalized_hist=cv.calcHist([equalized_img],[0],None,[256],[0,256])
plt.figure()
plt.title("直方图均衡化后的图像直方图")
# 均衡化后直方图部分修改
plt.xlabel("Bins像素值的取值区间")
x = range(256)
plt.bar(x, equalized_hist.ravel(), width=1.0, alpha=0.7)  # 添加x轴位置、展平数据
plt.ylabel("每一像素值在图像中的像素总数")
plt.xlim([0,256])
plt.show()
原始直方图 原始图像 直方图均衡化统计图 直方图均衡后图

4.直方图均衡化总结

如果我们碰到图片视觉效果不佳,例如灰蒙蒙的,很多细节性的东西都看不太清。这时,我们可以通过直方图均衡化的方法调整图片视觉效果。

方法是:首先画一下它的直方图,来看一下像素分布情况。通常效果不佳的图像,大部分在灰度值较高的部分,而且分布很集中。这时我们可以通过图像的均衡处理,即将图像颜色分解后按照灰度的累积分布函数处理或按各自颜色的分布函数处理。直方图均衡化处理后的直方图分布比较分散,能够涵盖整个x轴。图片视觉效果得到改善。

直方图均衡化的作用:增强图像数据的对比度有利于特征的提取,直方图均衡化可以自动调整图像的对比度。不论是从肉眼还是算法来看都有帮助。

posted @ 2025-04-08 21:58  heyuikn  阅读(143)  评论(0)    收藏  举报