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

如何提取一张图像的色调并迁移应用到另一张图像上?

如何提取一张图像的色调并将其应用到另一张图像上?

需求说明

需要将艾什莉·本森(Ashley Benson)的人像调整为《蒙娜丽莎》的图像色彩风格,参考素材如下:
艾什莉·本森原图
《蒙娜丽莎》色彩参考图

解决方案

可以根据使用场景选择以下两种方案,都能实现自然的色调迁移效果:

方案1:Photoshop 零代码快速匹配(适合普通用户,5分钟出效果)

PS自带的颜色匹配功能专门针对这类色调迁移需求,操作步骤如下:

  1. 在PS中同时打开两张素材,选中艾什莉的人像作为待调整图层
  2. 顶部菜单栏依次选择 图像 > 调整 > 匹配颜色
  3. 在弹出的设置面板中,「源」选择当前打开的PS文件,「图层」选择蒙娜丽莎参考图层
  4. 微调三个参数到自然效果即可:
    • 明亮度:建议设置在80-110区间,避免人像过暗丢失面部细节
    • 颜色强度:建议设置在60-90区间,避免油画的黄调过重导致肤色失真
    • 渐隐:建议设置在10-30区间,适当保留人像本身的皮肤通透感

优化技巧:调整前可以先用选区工具框选蒙娜丽莎的皮肤区域单独做匹配,避开背景和深色衣物的暗部脏色,最终肤色会更自然。如果想要更贴近油画质感,可以给最终结果叠加10%-20%透明度的油画布纹理素材,再添加1%左右的单色杂色模拟画布颗粒感。

方案2:Python 代码自动化迁移(适合批量处理/自定义效果)

这个方案基于经典的Reinhard色彩迁移算法,在LAB色彩空间下匹配两张图的色彩均值和标准差,不会破坏原图的轮廓和结构细节,代码可直接运行:

  1. 先安装依赖库
    pip install opencv-python numpy
  2. 运行以下代码,注意替换文件路径为你本地的素材路径
import cv2
import numpy as np

def image_stats(image):
    # 计算图像LAB通道的均值与标准差
    (l_channel, a_channel, b_channel) = cv2.split(image)
    return (
        l_channel.mean(), l_channel.std(),
        a_channel.mean(), a_channel.std(),
        b_channel.mean(), b_channel.std()
    )

def color_transfer(ref_img, target_img):
    # 转换到LAB色彩空间,分离亮度与色彩通道
    ref = cv2.cvtColor(ref_img, cv2.COLOR_BGR2LAB).astype("float32")
    target = cv2.cvtColor(target_img, cv2.COLOR_BGR2LAB).astype("float32")

    # 获取两张图的通道统计值
    lMeanRef, lStdRef, aMeanRef, aStdRef, bMeanRef, bStdRef = image_stats(ref)
    lMeanTar, lStdTar, aMeanTar, aStdTar, bMeanTar, bStdTar = image_stats(target)

    # 对目标图做色彩归一化,匹配参考图的色彩分布
    l, a, b = cv2.split(target)
    l = (l - lMeanTar) * (lStdRef / lStdTar) + lMeanRef
    a = (a - aMeanTar) * (aStdRef / aStdTar) + aMeanRef
    b = (b - bMeanTar) * (bStdRef / bStdTar) + bMeanRef

    # 裁剪数值到合法色彩区间,转回BGR空间
    l = np.clip(l, 0, 255)
    a = np.clip(a, 0, 255)
    b = np.clip(b, 0, 255)
    result = cv2.merge([l, a, b]).astype("uint8")
    return cv2.cvtColor(result, cv2.COLOR_LAB2BGR)

# 读取素材:ref_img是色调参考图(蒙娜丽莎),target_img是待调整的人像图
ref_img = cv2.imread("mona_lisa.png")
target_img = cv2.imread("ashley.png")
match_result = color_transfer(ref_img, target_img)
# 保存结果
cv2.imwrite("color_match_result.png", match_result)

注意:本地素材路径不要包含中文,否则会出现OpenCV读取图片失败的问题。如果想要调整色调浓度,可以修改代码中标准差缩放的比例,数值越低越接近原图色彩。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:51:21