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

如何用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自带的rainbow colormap,通过HSV转换降低饱和度,不用自己手动生成全量颜色映射。
  • numpy数组的处理更适合批量操作,如果你的图像数量多,这个方案的扩展性更好。

额外提示:

如果不需要低饱和度效果,只要把两个方案里的饱和度参数改成1就行,直接得到高饱和的彩虹色阶。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:16:35