如何用Python将灰度图转为彩色图(偏好PIL/matplotlib)
当然可以搞定!把0-256数值生成的灰度PNG转成低饱和度彩虹色阶,用Python完全能实现,我给你两种靠谱方案——优先用你指定的PIL库,再补一个matplotlib的方法,都能完美适配你的需求。
方案一:使用PIL库实现
PIL(Pillow)是处理图像的老牌库,自定义颜色映射的灵活性很高,适合精准控制饱和度。
首先确保你已经安装了Pillow:
pip install pillow
然后是完整代码:
from PIL import Image import colorsys # 生成低饱和度彩虹色映射(适配0-255的灰度值) def generate_low_saturation_rainbow_map(): color_map = [] for gray_value in range(256): # 色调从0(红色)过渡到0.66(紫色),覆盖彩虹核心色系 hue = gray_value / 255 * 0.66 # 固定低饱和度(0.3)和中等亮度(0.7),保证视觉柔和 r, g, b = colorsys.hsv_to_rgb(hue, 0.3, 0.7) # 转换为PIL需要的0-255整数格式 color_map.append((int(r*255), int(g*255), int(b*255))) # 如果你的灰度值包含256,这里可以追加一个对应颜色(比如和255一致) color_map.append(color_map[-1]) return color_map # 读取灰度PNG并确保是单通道灰度模式 gray_image = Image.open("your_input_gray.png").convert("L") # 获取自定义低饱和度彩虹色映射 rainbow_color_map = generate_low_saturation_rainbow_map() # 给灰度图应用颜色映射 colorized_image = gray_image.point(lambda x: rainbow_color_map[x]) # 保存结果或直接显示 colorized_image.save("output_low_sat_rainbow.png") colorized_image.show()
代码说明:
- 用
colorsys.hsv_to_rgb生成颜色:HSV模式下,我们固定饱和度(S)为0.3来实现低饱和效果,亮度(V)设为0.7避免过暗或过曝。 - 色调(H)从0到0.66:对应彩虹的红→橙→黄→绿→蓝→紫完整色系,避免重复颜色。
- 额外处理了256的灰度值:如果你的C代码确实生成了0-256的数值,直接用最后一个颜色映射对应即可。
方案二:使用matplotlib实现
如果你更倾向于用现成的色阶工具,matplotlib自带的colormap可以快速实现,而且调整饱和度也很方便。
先安装依赖(如果没装的话):
pip install matplotlib numpy pillow
完整代码:
import matplotlib.pyplot as plt import numpy as np from PIL import Image import colorsys # 读取灰度图并转换为numpy数组 gray_image = Image.open("your_input_gray.png").convert("L") gray_array = np.array(gray_image) # 获取matplotlib默认的彩虹colormap,然后降低饱和度 def desaturate_colormap(original_cmap, target_saturation=0.3): new_colors = [] for i in range(original_cmap.N): # 获取原colormap的RGBA值 r, g, b, alpha = original_cmap(i) # 转成HSV模式调整饱和度 h, s, v = colorsys.rgb_to_hsv(r, g, b) # 替换为目标饱和度,再转回RGB new_r, new_g, new_b = colorsys.hsv_to_rgb(h, target_saturation, v) new_colors.append((new_r, new_g, new_b, alpha)) # 创建新的低饱和度colormap return plt.matplotlib.colors.ListedColormap(new_colors) # 生成低饱和度彩虹色阶 low_saturation_rainbow = desaturate_colormap(plt.get_cmap("rainbow"), 0.3) # 应用色阶并转换为PIL图像 # 先把灰度值归一化到0-1范围,再应用colormap colorized_array = low_saturation_rainbow(gray_array / 255) # 提取RGB通道并转成0-255整数 colorized_image = Image.fromarray((colorized_array[:, :, :3] * 255).astype(np.uint8)) # 保存或显示结果 colorized_image.save("output_low_sat_rainbow_matplotlib.png") plt.imshow(colorized_image) plt.axis('off') # 隐藏坐标轴 plt.show()
代码说明:
- 利用matplotlib自带的
rainbowcolormap,通过HSV转换降低饱和度,不用自己手动生成全量颜色映射。 - numpy数组的处理更适合批量操作,如果你的图像数量多,这个方案的扩展性更好。
额外提示:
如果不需要低饱和度效果,只要把两个方案里的饱和度参数改成1就行,直接得到高饱和的彩虹色阶。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

