目标
通过本篇文章的学习,你将学习到以下内容:
- 直方图均衡化的概念,并利用它来提高图像的对比度
- 全局直方图均衡化
- 对比度受限的直方图均衡化
前言
考虑这样一幅图像,它的像素值仅局限于某个特定的值范围,例如,较亮的图像将把所有像素限制在高值上。但是一幅好的图像会有来自图像所有区域的像素。因此,你需要将这个直方图拉伸到两端,这就是直方图均衡化的作用(简单来说),这通常会提高图像的对比度。
下面我们以一幅图像为例,使用numpy库的np.historam()
函数实现该图像的直方图,使用hist.cumsum()
函数查看该图像的亮度分布–累积分布函数(CDF)图,理想情况下沿直线增长,可以通过直方图均衡,调整图片到最理想的状态,为后续的直方图的均衡化提供直观的参考。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
# 加载原始灰度图像
img = cv.imread('./data/pool_table.jpg', 0)
# 实现该图像的直方图
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
# 查看该图像的亮度累积分布
cdf = hist.cumsum()
# 亮度累积分布归一化
cdf_normalized = cdf*float(hist.max())/cdf.max()
# 显示原始图像
plt.subplot(121), plt.imshow(img, 'gray')
# 绘制亮度累积分布图与直方图
plt.subplot(122), plt.plot(cdf_normalized, color='g'),