用Python做有趣的AI项目 3:黑白图像自动上色(AI 上色器)

这个项目的目标是使用深度学习模型,将黑白照片自动"还原"出彩色版本,可以用在修复老照片、创意设计等场景。

🧠 项目概述

我们将使用:

cpp 复制代码
Python

OpenCV:读取和处理图像

预训练的深度学习模型(基于 Caffe 或 TensorFlow)来实现图像上色

如果你不打算训练自己的模型(因为需要很多数据和时间),我们可以使用 OpenCV 官方集成的预训练模型。

✅ 项目准备

第一步:安装依赖

cpp 复制代码
bash

pip install opencv-python opencv-contrib-python numpy

📦 第二步:下载预训练模型(OpenCV 提供)

我们将使用由 Richard Zhang 等人 提供的模型,OpenCV 已集成支持。

需要下载这三个文件(约 300MB):

cpp 复制代码
colorization_deploy_v2.prototxt

colorization_release_v2.caffemodel

pts_in_hull.npy(色彩分布点)

🧰 第三步:上色代码实现

python

cpp 复制代码
import cv2
import numpy as np

# 模型路径(需要你提前下载好)
proto_file = 'models/colorization_deploy_v2.prototxt'
model_file = 'models/colorization_release_v2.caffemodel'
pts_file = 'models/pts_in_hull.npy'

# 加载网络
net = cv2.dnn.readNetFromCaffe(proto_file, model_file)
pts = np.load(pts_file)

# 加载颜色点
class8 = net.getLayerId("class8_ab")
conv8 = net.getLayerId("conv8_313_rh")
pts = pts.transpose().reshape(2, 313, 1, 1)
net.getLayer(class8).blobs = [pts.astype("float32")]
net.getLayer(conv8).blobs = [np.full([1, 313], 2.606, dtype="float32")]

def colorize_image(image_path):
    # 读取灰度图像并转换为 LAB
    bw_image = cv2.imread(image_path)
    h, w = bw_image.shape[:2]
    img_rgb = (bw_image.astype("float32")) / 255.0
    img_lab = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2Lab)
    l_channel = img_lab[:, :, 0]
    l_resized = cv2.resize(l_channel, (224, 224))
    l_resized -= 50  # 中心化

    net.setInput(cv2.dnn.blobFromImage(l_resized))
    ab_channels = net.forward()[0, :, :, :].transpose((1, 2, 0))
    ab_channels = cv2.resize(ab_channels, (w, h))

    lab_output = np.concatenate((l_channel[:, :, np.newaxis], ab_channels), axis=2)
    color_image = cv2.cvtColor(lab_output, cv2.COLOR_Lab2BGR)
    color_image = (np.clip(color_image, 0, 1) * 255).astype("uint8")
    return color_image

🖼️ 第四步:测试和显示结果

cpp 复制代码
python

import matplotlib.pyplot as plt

def show_result(image_path):
    color_img = colorize_image(image_path)
    bw_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    plt.figure(figsize=(10, 5))
    plt.subplot(1, 2, 1)
    plt.imshow(bw_img, cmap='gray')
    plt.title("原始黑白图")
    plt.axis('off')

    plt.subplot(1, 2, 2)
    plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
    plt.title("上色后的图像")
    plt.axis('off')

    plt.show()

示例

cpp 复制代码
# show_result('old_photo.jpg')

🧩 可选扩展

用 Flask 打造网页上传上色器

加入批量上色功能

训练自己的模型(高阶)

风格化上色:做成漫画风、复古风等

相关推荐
陆陆陆六7 分钟前
# 五个AI引擎的答案采集:反爬、去重与时间窗对齐的三个工程细节
python·net·ai答案采集
QYR_118 分钟前
年复合增长率11.4%!机器人指端视触觉传感器加速迈向规模化应用
人工智能·数码相机
武天旭28 分钟前
AI安全--AI大模型的数据投毒攻击解析
人工智能·深度学习·安全
AI技术新视界29 分钟前
LLM 提示词缓存(Prompt Caching)的秘密
人工智能·缓存·llm·prompt
火山引擎开发者社区41 分钟前
从企业开发者到 Agent 先锋,火山引擎 Agent 先锋计划邀你进击!
人工智能
.痞老板.1 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦1 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
这张生成的图像能检测吗1 小时前
(论文速读)Ponder:通过神经渲染进行点云预训练
人工智能·深度学习·机器学习·点云·3d技术·神经渲染
johnsong1 小时前
AI前沿日报 · 2026-11-05:暗网与裂痕
人工智能
张彦峰ZYF1 小时前
升级了不等于变好了:AI回归测试的固定评测集、版本对比、质量阈值与CI门禁
人工智能·后端·模型或提示词升级·语言模型没有编译器与确定性输出·总体、切片与回退清单·红线、护栏与目标·ci门禁把判定写进合并路径