目录
图像的直方图是什么¶
- 直方图是图像中像素强度分布的图形表达方式。
- 它统计了每一个强度值所具有的像素个数。
直方图均衡化是什么¶
- 直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。
- 说得更清楚一些, 像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围.。
直方图均衡化是怎样做到的¶
-
均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开。
- 要想实现均衡化的效果, 映射函数应该是一个累积分布函数 (cdf) 。
实现过程可视化分析
1、读取原始图
img_vis = cv2.imread(rfn_path, cv2.IMREAD_GRAYSCALE)
plt.imshow(img_vis, 'gray')
plt.show()
2、 统计原始图直方图
plt.hist(img_vis.flatten(), 256)
plt.show()
3、均衡化后的图像
# 均衡化处理
img_equalize_hist, cdf = equalize_hist(img_vis)
# 显示均衡化图
from PIL import Image
img_equalize_hist = Image.fromarray(np.uint8(img_equalize_hist))
img_equalize_hist.show()
4、均衡化后的直方图
plt.hist(img_equalize_hist.flatten(),256)
plt.show()
5、累积分布函数图
6、全部源代码
import numpy as np
import os
import cv2
import csv
import matplotlib.pyplot as plt
rgb_path = "L:\\Flir\\FLIR_ADAS_1_3\\FLIR_ADAS_1_3\\train\\RGB"
rgb_file_name = os.listdir(rgb_path)
vis_stds = []
infrar_stds = []
def equalize_hist(im, nbr_bins=256):
"""对一幅灰度图像进行直方图均衡化"""
# 图像直方图统计
imhist, bins = np.histogram(im.flatten(), nbr_bins, normed=True)
# 累积分布函数
cdf = imhist.cumsum()
cdf = 255.0 * cdf / cdf[-1]
# 使用累积分布函数的线性插值,计算新的像素值
im2 = np.interp(im.flatten(), bins[:-1], cdf) # 分段线性插值函数
return im2.reshape(im.shape), cdf
rfn_path = os.path.join(rgb_path, rgb_file_name[1])
img_infrar = None
if os.path.exists(rfn_path):
img_vis = cv2.imread(rfn_path, cv2.IMREAD_GRAYSCALE)
# 显示原始图
# plt.imshow(img_vis, 'gray')
# plt.show()
# 统计原始图直方图
# plt.hist(img_vis.flatten(), 256)
# plt.show()
# 图像均衡化
img_equalize_hist, cdf = equalize_hist(img_vis)
# 显示均衡化图
# from PIL import Image
# img_equalize_hist = Image.fromarray(np.uint8(img_equalize_hist))
# img_equalize_hist.show()
# 显示均衡化图的直方图
plt.hist(img_vis.flatten(),256, color='r')
plt.show()
# 显示累积分布函数
# plt.plot(cdf, color='r')
# plt.show()