# coding: utf-8
# !/usr/bin/python
"""
@File : 直方图均衡化.py
@Author : jiaming
@Modify Time: 2020/2/6 15:24
@Contact :
@Version : 1.0
@Desciption : 直方图均衡化
将山峰灰度图转化为平原灰度图
"""
import os
import sys
import numpy as np
import cv2
import pprint
from matplotlib import pyplot as plt
rawPath = os.path.abspath(__file__)
currentFile = os.path.basename(sys.argv[0])
dataPath = rawPath[:rawPath.find(currentFile)] + r'static\\'
img = cv2.imread(dataPath+'big_deep.png', 0)
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf.max()
plt.plot(cdf_normalized, color='b')
plt.hist(img.flatten(), 256, [0, 256], color='r')
plt.xlim([0, 256])
plt.legend(('cdf', 'histogram'), loc='upper left')
plt.show()
可以看出直方图大部分在灰度值较高的部分,而且分布很集中,而我们希望直方图分布比较分散,能够涵盖整个x轴。所以我们就需要一个变换函数帮助我们把现在的直方图映射到一个广泛分布的直方图中。这就是直方图均衡化的要做的事情。
img = cv2.imread(dataPath+'big_deep.png', 1)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst", result)
cv2.waitKey(0)
即使我们传入的是一个比较暗的图片,在经过直方图均衡化后y也能得到相同的结果,因此,直方图均衡化经常用来使所有的图片具有相同的亮度条件的参考工具。
常用于脸部识别,在训练分类器前,训练集的所有工具都先要经过直方图均衡化从而使它们达到相同的亮度条件。