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
相关产品推荐
相关产品推荐

