用一句大白话说一下直方图均衡的概念,直方图均衡(histogram equalization)是通过让原图的每个像素点的灰度值通过某个函数变换成另一个值,来提高原图的对比度,具体的函数方程为output = L*T(input)其中output为映射后的灰度值,L为灰度级255,T(r)为灰度值r的累积分布概率,计算方法:灰度值为r及以下的像素点总个数数/总像素点数。
对于数学上的一些分析,这里就不写了,想了解具体的可以看这里
以下是效果图片和代码:
原图
直方图均衡之后
# img_hist = cv2.calcHist(img, [1], None, [256], [0, 256])另一个计算直方图的函数
plt.hist(img[:,:,0].flatten(), 256, [0, 256], color = 'r')
# plt.plot(img_hist)
plt.title('original')
plt.show()
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
# equalize the histogram of the Y channel
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0]) # only for 1 channel
plt.hist(img_yuv[:,:,0].flatten(), 256, [0, 256], color='r')
img_output = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR) # y: luminance
# img_equalized_hist = cv2.calcHist(img_yuv, [1], None, [256], [0, 256])
# plt.plot(img_equalized_hist)
plt.title('equalized')
plt.show()
# convert the YUV image back to RGB format
cv2.imwrite(path, img_output)
cv2.imshow('Color input image', img)
cv2.imshow('Histogram equalized', img_output)
key = cv2.waitKey(0)
cv2.destroyAllWindows()