代码步骤:图片输入→灰度化→绘制直方图→直方图均衡化→绘制直方图→图片输出
1 绘制直方图
直方图就是对图像中每个像素值进行频数统计,绘制成柱状统计图,x轴是灰度值,y轴是每个灰度出现的频次。


理解下面的函数
# 直方图绘制函数
import cv2
import numpy as np
def draw_hist(image, color): # 定义了一个名为draw_hist的函数
"""
绘制直方图
:param image: 输入图像,哪个图的直方图图像(灰度化之后的)
:param color: 直方图柱子什么颜色,BGR元组
:return: 直方图图像
"""
hist = cv2.calcHist( # 使用OpenCV的calcHist函数计算图像直方图
[image], # 计算直方图的图像,支持多图像输入,因此一个图像也要写成列表
[0], # 要计算的图像灰度值通道需要,灰度图只有一个通道,所以是0
None, # 掩膜,全图计算不需要
[256], # 直方图x轴的精细程度,256表示分为256份
[0, 255] # x轴的范围
)
print(hist.shape) # (256, 1) 256表示有256个灰度频数数据
# 提取关键数据
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(hist)
# print('min_val:', min_val) # 0.0,最小的灰度频数
print('max_val:', max_val) # 471606.0,最大的灰度频数
# print('min_loc:', min_loc) # (0, 255),最小的灰度频数对应的灰度值
# print('max_loc:', max_loc) # (0, 1),最大的灰度频数对应的灰度值
# 创建一张纯黑图,画柱子
hist_img = np.zeros([256, 256, 3], np.uint8)
# 为了让y轴最高的柱子留一部门空白,最高柱子的高度
hpt = int(256 * 0.9)
for h in range(256): # 从0到255,每个灰度画柱子
# 柱子高度(整数) = 直方图的最高值hpt * 每个灰度的频数/最高的频数
intensity = int(hpt * hist[h] / max_val)
# print(intensity)
# 画柱子(线)
cv2.line(
hist_img,
(h, 256), # x轴的起始点
(h, 256 - intensity), # 线段从下往上画的终点
color
)
return hist_img
2 直方图均衡化
一张好的图像通常在直方图上分布比较均匀,这样的图像对比度比较强烈(明暗差别大)。
直方图均衡化可以提升原图的观感,需要遍历图像的像素,统计每个灰度值出现的频数、比例与累积比例,并重新映射到新的范围(如0-255,或其他范围),从而提升图像的观感。

均衡化之后的图像显示效果会更加强烈,具有广泛地应用前景:
1.医学影像处理:
X光、CT扫描、核磁共振
2.摄影与监控
改善照片的对比度和色彩平衡提升观感
3.卫星影像处理
可以增加图像质量,提高解析度
2.1 原始的直方图均衡化
选择hist_method(直方图均衡化方法)中的equalizeHist参数设置为原始的直方图均衡化算法。
<

最低0.47元/天 解锁文章
415

被折叠的 条评论
为什么被折叠?



