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

如何用Python将老旧黑白照片转换为真实彩色?

使用Python给老旧黑白照片上色的实用方法

下面分享两种经过验证的Python实现方案,适合给老旧黑白照片生成贴近真实的彩色效果:

方案一:OpenCV + 预训练深度学习模型

这是一种轻量、稳定的方案,基于OpenCV的DNN模块调用预训练的上色模型,适合大多数普通场景。

步骤:

  1. 安装依赖
pip install opencv-python numpy
  1. 获取预训练模型文件
    需要三个文件:colorization_deploy_v2.prototxt(模型结构)、colorization_release_v2.caffemodel(权重)、pts_in_hull.npy(色彩聚类点),可从OpenCV官方模型仓库获取,确保文件和代码在同一目录下。
  2. 运行上色代码
import cv2
import numpy as np

# 加载预训练模型
net = cv2.dnn.readNetFromCaffe('colorization_deploy_v2.prototxt', 'colorization_release_v2.caffemodel')
pts = np.load('pts_in_hull.npy')

# 配置模型参数
class8_layer = net.getLayerId("class8_ab")
conv8_layer = net.getLayerId("conv8_313_rh")
pts = pts.transpose().reshape(2, 313, 1, 1)
net.getLayer(class8_layer).blobs = [pts.astype("float32")]
net.getLayer(conv8_layer).blobs = [np.full([1, 313], 2.606, dtype="float32")]

# 读取并预处理黑白图片
image = cv2.imread('old_bw_photo.jpg')
scaled_img = image.astype("float32") / 255.0
lab_img = cv2.cvtColor(scaled_img, cv2.COLOR_BGR2LAB)

resized_lab = cv2.resize(lab_img, (224, 224))
L_channel = cv2.split(resized_lab)[0]
L_channel -= 50  # 数据归一化

# 执行上色
net.setInput(cv2.dnn.blobFromImage(L_channel))
ab_channels = net.forward()[0, :, :, :].transpose((1, 2, 0))

# 合并通道并转换回RGB格式
ab_channels = cv2.resize(ab_channels, (image.shape[1], image.shape[0]))
original_L = cv2.split(lab_img)[0]
colorized_lab = np.concatenate((original_L[:, :, np.newaxis], ab_channels), axis=2)

colorized_img = cv2.cvtColor(colorized_lab, cv2.COLOR_LAB2BGR)
colorized_img = np.clip(colorized_img, 0, 1)
colorized_img = (255 * colorized_img).astype("uint8")

# 保存结果
cv2.imwrite('colorized_photo.jpg', colorized_img)

方案二:DeOldify库(老照片专属上色)

DeOldify是专门针对老旧照片优化的上色库,生成的色彩更贴近真实年代场景,对有历史感的照片效果更好。

步骤:

  1. 安装依赖(需PyTorch环境,GPU加速可大幅提升速度)
pip install deoldify torch torchvision pillow
  1. 运行上色代码
from deoldify.visualize import get_image_colorizer

# 初始化上色器,artistic=False表示偏向真实色彩而非艺术化效果
colorizer = get_image_colorizer(artistic=False)

# 执行上色并保存,render_factor控制细节程度(建议20-40之间调整)
colorizer.plot_transformed_image(
    'old_bw_photo.jpg',
    render_factor=35,
    compare=False,  # 设为True可同时显示原图和上色图对比
    results_dir='./'
)

实用提示

  • 若照片模糊、破损严重,建议先使用图像修复工具(如OpenCV的inpaint函数)修复后再上色,效果会更理想
  • 上色后的结果可通过PIL或OpenCV调整色彩平衡、对比度,进一步贴近真实效果
  • 预训练模型路径需确保正确,避免加载失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:15:40