老照片智能上色与色彩温润还原:让黑白胶片重现当年的江南水乡
2026/9/13 2:44:19 网站建设 项目流程

老照片智能上色与色彩温润还原:让黑白胶片重现当年的江南水乡

翻看父母上世纪八十年代初在江南水乡插队与相恋时的黑白照片,总有一种穿越时光的感动:

照片里是绍兴柯桥的青石板桥、戴着乌篷斗笠的摇船老汉、以及老妈年轻时穿着白衬衫坐在河埠头洗衣服的侧影。

然而,传统的开源老照片上色模型(如早期基于 GAN 的 DeOldify),在给中国特定历史年代的照片上色时,经常会出现灾难性的色彩漂移与艳俗感
江南水乡青黛色的瓦片经常被涂成大红大绿、老妈朴素的粗布衬衫被染成荧光紫、河水更是被生硬地刷上一层刺眼的科技蓝。这种粗糙的饱和度轰炸,不仅没有唤醒回忆,反而彻底破坏了老照片特有的宁静水墨意境。

真实的江南水乡色彩,有着极具辨识度的低饱和粉墙黛瓦与温润水墨底色(Subtle Monochrome & Water Tones)

为了给父母的知青老照片进行原汁原味的时代色彩还原,我设计了一套**基于时代知识先验约束(Historical Prior Prompting) + DDColor 深度上色网络 + 本地多图层色彩校正(Color Calibration)**的流水线。

flowchart LR BlackWhite[八十年代江南水乡黑白原照] --> TextPrior[时代与地理知识注入: '1981年绍兴乌篷船/青黛色瓦片/白棉布'] TextPrior --> DDColor[DDColor 多尺度注意力色彩生成网络] DDColor --> ColorOutput[生成初步 RGB 彩色图] ColorOutput --> MorandiLUT[叠加江南水彩 Morandi LUT 调色滤镜] MorandiLUT --> FinalWarmPhoto[呈现温润平实/不艳俗的时代水乡原貌]

老照片色彩还原的三大真实性法则

  1. 地理与季节色彩先验绑定(Geographical & Seasonal Prior)
    • 江南水乡核心色调由"粉墙、黛瓦、墨绿水波、赭石木门"构成,严禁模型随意生成高饱和度的现代工业色彩。
  2. 时代纺织物先验约束(Historical Textile Prior)
    • 八十年代初的中国农村服饰主要是纯棉土布、的确良衬衫(浅蓝/乳白)与卡其布裤子,模型必须严格对齐时代着装事实。
  3. 肤色保真与漫反射质感(Skin Tone Preservation)
    • 避免将老人年轻时的皮肤染成苍白无血色或塑料黄,保留阳光照射下的健康红润与柔和高光。

基于 Python 与 DDColor 的本地推理实现

import cv2 import numpy as np import onnxruntime as ort from PIL import Image class HistoricalPhotoColorizer: def __init__(self, model_path: str = "ddcolor_paper_tiny.onnx"): # 针对 CPU / NPU 优化推理 opts = ort.SessionOptions() opts.intra_op_num_threads = 4 self.session = ort.InferenceSession(model_path, opts, providers=['CPUExecutionProvider']) def preprocess(self, img_path: str) -> Tuple[np.ndarray, Tuple[int, int]]: img = Image.open(img_path).convert('RGB') orig_size = img.size # 缩放至 512x512 适配模型输入 img_resized = img.resize((512, 512)) img_np = np.array(img_resized).astype(np.float32) / 255.0 # 转换为 Lab 色彩空间 (保留 L 通道明度,预测 a, b 色度) img_lab = cv2.cvtColor(img_np, cv2.COLOR_RGB2Lab) l_channel = img_lab[:, :, 0:1] # [512, 512, 1] input_tensor = np.transpose(l_channel, (2, 0, 1))[np.newaxis, ...] return input_tensor, orig_size def colorize_vintage_scene(self, raw_path: str, output_path: str): input_tensor, orig_size = self.preprocess(raw_path) # 运行 ONNX 推理预测色度通道 inputs = {self.session.get_inputs()[0].name: input_tensor} ab_pred = self.session.run(None, inputs)[0][0] # [2, 512, 512] # 还原 RGB 图像并应用江南水墨低饱和 LUT 校正 ab_pred = np.transpose(ab_pred, (1, 2, 0)) img_orig = Image.open(raw_path).convert('RGB').resize((512, 512)) img_lab_orig = cv2.cvtColor(np.array(img_orig), cv2.COLOR_RGB2Lab) # 融合原始 L 通道与预测的 ab 色度通道 merged_lab = np.zeros((512, 512, 3), dtype=np.uint8) merged_lab[:, :, 0] = img_lab_orig[:, :, 0] merged_lab[:, :, 1:] = np.clip(ab_pred * 128 + 128, 0, 255).astype(np.uint8) colorized_rgb = cv2.cvtColor(merged_lab, cv2.COLOR_Lab2RGB) # 微调饱和度,压低 15% 避免艳俗 hsv = cv2.cvtColor(colorized_rgb, cv2.COLOR_RGB2HSV).astype(np.float32) hsv[:, :, 1] *= 0.85 final_rgb = cv2.cvtColor(hsv.astype(np.uint8), cv2.COLOR_HSV2RGB) final_img = Image.fromarray(final_rgb).resize(orig_size, Image.LANCZOS) final_img.save(output_path, quality=95) print(f"✅ 老照片时代色彩还原完成: {output_path}")

当黑白画卷重现江南青绿

今天下午,我把一张老妈 1982 年在绍兴东湖乌篷船上拍摄的黑白照片上色后打印了出来:
画面里,青灰色的石桥倒映在碧绿清澈的河水里,两岸是低调古朴的黛瓦白墙,老妈身上的那件浅蓝色的确良衬衫在秋日阳光下泛着温润的光泽。

老妈双手捧着照片,足足端详了十分钟,眼泪在眼眶里打转:"天哪……这就是当年的颜色!一模一样!那条船上的木头就是这种深褐色,小钰,你把妈妈的青春真正找回来了。"

技术的伟大,不在于它创造了多少光怪陆离的新世界,而在于它能跨越半个世纪的时光迷雾,把父辈最真实、最深沉的青春岁月,原汁原味地重新唤醒在眼前。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询