如何将histogram equalization生成的新直方图转换为图像
直方图均衡映射转图像的实现方法
你当前代码中定义的
im变量注释为图像像素值示例,但从计算逻辑来看,你实际是把它作为各灰度级对应的像素频数使用,这一前提要先明确,避免后续逻辑出错。
核心转换逻辑
直方图均衡的计算过程最终得到的hist_x数组就是「原始灰度值→均衡后灰度值」的映射表:
- 数组索引位置对应原始灰度值
- 索引对应的数值就是该灰度值均衡后的目标灰度值
转换图像只需要把原始图像中每个像素的灰度值,按照这个映射表做替换即可。
完整实现代码示例
import numpy as np import matplotlib.pyplot as plt # 1. 原有直方图均衡计算逻辑 im = [9,8,11,4,10,15,4,3] # 0-7共8个灰度级各自的像素频数 gray_level_num = len(im) summ = sum(im) pk = [] for i in im: pk.append(i/summ) cdf = [] for i in range(len(pk)): if(i!=0): pk[i] = pk[i-1] + pk[i] cdf.append(pk[i]) sk=[] for i in cdf: sk.append(i * (gray_level_num - 1)) # 得到映射表:map_table[原始灰度] = 目标灰度 map_table = np.array([round(i) for i in sk], dtype=np.uint8) # ------------------- 转换为图像的核心步骤 ------------------- # 示例原始8位灰度图,像素值范围为0到gray_level_num-1,可替换为你的真实图像数据 original_img = np.array([ [0, 1, 2, 3, 4], [5, 5, 6, 7, 0], [1, 2, 2, 3, 7] ], dtype=np.uint8) # 用映射表对原始图像所有像素做替换,得到均衡后图像 equalized_img = map_table[original_img] # ------------------- 结果展示 ------------------- plt.figure(figsize=(10,4)) plt.subplot(121) plt.title("Original Image") plt.imshow(original_img, cmap="gray", vmin=0, vmax=gray_level_num-1) plt.subplot(122) plt.title("Equalized Image") plt.imshow(equalized_img, cmap="gray", vmin=0, vmax=gray_level_num-1) plt.show() # 原有直方图绘制逻辑 hist_x = map_table hist_y = np.array(im) plt.plot(hist_x, hist_y) plt.title("Equalized Histogram") plt.show()
关键说明
- 如果你的
im变量实际是原始图像的像素数组而非灰度频数,需要先调用np.histogram(original_img, bins=gray_level_num)[0]统计得到各灰度的频数,再代入原有计算逻辑。 - 对于常见的8位灰度图,灰度级数量为256,对应
gray_level_num=256,映射后直接用uint8类型存储即可正常显示。
内容的提问来源于stack exchange,提问作者selin
相关产品推荐
相关产品推荐

