You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:24:04