如何用Python将老旧黑白照片转换为真实彩色?
使用Python给老旧黑白照片上色的实用方法
下面分享两种经过验证的Python实现方案,适合给老旧黑白照片生成贴近真实的彩色效果:
方案一:OpenCV + 预训练深度学习模型
这是一种轻量、稳定的方案,基于OpenCV的DNN模块调用预训练的上色模型,适合大多数普通场景。
步骤:
- 安装依赖
pip install opencv-python numpy
- 获取预训练模型文件
需要三个文件:colorization_deploy_v2.prototxt(模型结构)、colorization_release_v2.caffemodel(权重)、pts_in_hull.npy(色彩聚类点),可从OpenCV官方模型仓库获取,确保文件和代码在同一目录下。 - 运行上色代码
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是专门针对老旧照片优化的上色库,生成的色彩更贴近真实年代场景,对有历史感的照片效果更好。
步骤:
- 安装依赖(需PyTorch环境,GPU加速可大幅提升速度)
pip install deoldify torch torchvision pillow
- 运行上色代码
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
相关产品推荐
相关产品推荐

