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

Python中如何将特定范围RGBA图像还原为原始数值数组?

从RGBA图像还原原始数值数组

要从jet colormap生成的RGBA图像还原原始数组,需要反向执行颜色映射的步骤:先将RGBA值匹配回归一化后的[0,1]区间值,再通过反归一化得到原始的1500-4500范围数值。

完整还原代码示例

import matplotlib.pyplot as plt
import numpy as np

# 原始生成代码(修正randInt为randint)
norm = plt.Normalize(vmin=1500, vmax=4500)
jet = plt.cm.jet
original = np.random.randint(1500, 4500, (100, 100))
converted = jet(norm(original))

# 开始还原过程
def rgba_to_original(rgba_img, cmap, norm):
    # 获取colormap的颜色查找表和对应归一化值
    lut = cmap._lut  # 形状为(256,4),对应归一化值0到1的256个颜色
    norm_values = np.linspace(0, 1, lut.shape[0])
    
    # 将RGBA图像展平为(N,4)的数组,方便匹配
    flat_rgba = rgba_img.reshape(-1, 4)
    # 计算每个像素与LUT中颜色的欧氏距离,找到最接近的颜色索引
    distances = np.linalg.norm(flat_rgba[:, None] - lut, axis=2)
    closest_indices = np.argmin(distances, axis=1)
    # 获取对应的归一化值
    normalized_vals = norm_values[closest_indices]
    # 反归一化得到原始数值,再还原为原数组形状
    original_vals = norm.inverse(normalized_vals).reshape(rgba_img.shape[:2])
    # 原始数值是整数,取整
    return original_vals.round().astype(int)

# 执行还原
restored = rgba_to_original(converted, jet, norm)

# 验证还原效果(查看前5x5区域的差异)
print("原始数组前5x5:")
print(original[:5, :5])
print("\n还原数组前5x5:")
print(restored[:5, :5])

关键说明

  • 利用colormap的查找表(cmap._lut)匹配RGBA值:jet默认包含256种离散颜色,每个颜色对应一个[0,1]区间的归一化值。
  • 通过计算欧氏距离找到最匹配的颜色,确保还原的数值尽可能接近原始值。
  • 用norm.inverse()完成反归一化,将[0,1]区间值转换回1500-4500范围。
  • 因为颜色映射是离散的,还原后的数值可能和原始值有±1的微小误差(取决于颜色精度)。

内容的提问来源于stack exchange,提问作者Alif Jamaluddin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:01:09