AI 数字人制作中的图像无缝融合技术详解
在构建 AI 数字人时,常需要将头部说话的视频与原始图片/视频进行合成。这一过程的核心在于图像无缝融合技术,它能让合成的区域与原背景自然过渡,消除拼接痕迹。
本文介绍了 AI 数字人制作中图像无缝融合的两种核心技术:拉普拉斯金字塔融合与泊松融合。拉普拉斯金字塔通过多尺度分解与重建,适合保留高频细节;泊松融合基于梯度域编辑,能实现光照自适应的平滑过渡。文章提供了完整的 Python 代码示例,详细解析了 OpenCV 中相关函数的用法及参数含义,并对比了两种算法的适用场景与优缺点,为实际开发提供技术参考。

在构建 AI 数字人时,常需要将头部说话的视频与原始图片/视频进行合成。这一过程的核心在于图像无缝融合技术,它能让合成的区域与原背景自然过渡,消除拼接痕迹。
常见的融合算法包括拉普拉斯金字塔融合和泊松融合。通过这两种方法,可以实现不同尺度下的细节保留或梯度域的自然过渡。
拉普拉斯金字塔融合通常用于处理纹理相似但光照略有差异的图片,而泊松融合则更适合处理边缘需要平滑过渡的场景,如人脸替换。
拉普拉斯金字塔通过对图片逐级进行下采样,再逐级上采样,利用高斯金字塔连续两层之间的差值来构建。它能捕获图像在不同尺度下的细节信息。
基本流程如下:
该过程理论上是无损的,若剔除低频分量仅保留高频分量,则可用于图像压缩。
融合需要一张 Mask 图,指定哪些区域进行融合(白色表示融合,黑色表示保留)。
import numpy as np
import cv2
# 修复尺寸不匹配的问题
def fix_size(img, target):
if img.shape[0] != target.shape[0] or img.shape[1] != target.shape[1]:
# OpenCV resize 参数为 (width, height)
img = cv2.resize(img, (target.shape[1], target.shape[0]), interpolation=cv2.INTER_LINEAR)
return img
# 拉普拉斯金字塔图像融合实现
def Laplacian_Pyramid_Blending_with_mask(A, B, m, num_levels=6):
gpA = [A.copy()]
gpB = [B.copy()]
gpM = [m.copy()]
# 先进行下采样,获取高斯金字塔
for i in range(num_levels):
gpA.append(cv2.pyrDown(gpA[i]))
gpB.append(cv2.pyrDown(gpB[i]))
gpM.append(cv2.pyrDown(gpM[i]))
# 逐层计算拉普拉斯金字塔
lpA = [gpA[num_levels]]
lpB = [gpB[num_levels]]
for i in range(num_levels, 0, -1):
LA = cv2.subtract(gpA[i-1], fix_size(cv2.pyrUp(gpA[i]), gpA[i-1]))
LB = cv2.subtract(gpB[i-1], fix_size(cv2.pyrUp(gpB[i]), gpB[i-1]))
lpA.append(LA)
lpB.append(LB)
# 根据 mask 进行融合
LS = []
for la, lb, gm in zip(lpA, lpB, gpM):
gm = fix_size(gm, la)
# 将二维 mask 转为三通道以匹配图像
gm = gm[..., np.newaxis] if gm.ndim == 2 else gm
la = fix_size(la, gm)
lb = fix_size(lb, gm)
ls = la * gm + lb * (1.0 - gm)
LS.append(ls)
# 根据拉普拉斯金字塔重建图片
ls_ = LS[0]
for i in range(1, num_levels + 1):
ls_ = fix_size(cv2.pyrUp(ls_), LS[i])
ls_ = cv2.add(ls_, LS[i])
ls_ = fix_size(ls_, A)
ls_ = np.clip(ls_, 0, 255).astype('uint8')
return ls_
注意:基于拉普拉斯金字塔的图像拼接对两张图片的匹配性要求较高,尤其是尺寸大小及融合位置需严格对齐。
泊松融合是一种梯度域编辑技术。它不直接修改像素值,而是解泊松方程,使得融合区域内的梯度与源图像相匹配,同时边界与目标图像平滑对接。这种方法能很好地保留源图像的细节结构,并适应目标图像的颜色和亮度。
OpenCV 封装了 seamlessClone 接口来实现此功能。
泊松融合通常涉及以下步骤:选择源图像和目标图像,定义蒙版,计算梯度,求解方程。
import cv2
import numpy as np
# 假设 crop_frame 是裁剪后的人脸视频帧,full_img 是原始背景图
# crop_info 包含裁剪坐标 oy1, oy2, ox1, ox2
oy1, oy2, ox1, ox2 = crop_info[1]
p = cv2.resize(crop_frame.astype(np.uint8), (ox2 - ox1, oy2 - oy1))
# 生成裁剪人脸大小的 mask,赋值为白色(即融合区域全部使用 crop_frame)
mask = 255 * np.ones(p.shape, p.dtype)
# 融合的中心点
location = ((ox1 + ox2) // 2, (oy1 + oy2) // 2)
# 使用 seamlessClone 进行融合
# flags: NORMAL_CLONE, MIXED_CLONE, MONOCHROME_TRANSFER
gen_img = cv2.seamlessClone(p, full_img, mask, location, cv2.NORMAL_CLONE)
Flags 说明:
NORMAL_CLONE: 不保留 dst 图像的纹理细节。目标区域的梯度完全由源图像决定。MIXED_CLONE: 保留 dest 图像的纹理细节。目标区域的梯度由源图像和目的图像组合计算。MONOCHROME_TRANSFER: 不保留 src 图像的颜色细节,只保留质地,颜色与目标图像一致。常用于皮肤质地填充。在实际的数字人项目中,选择哪种融合方式取决于具体需求:
fix_size 函数进行预处理。num_levels 参数。图像无缝融合是 AI 数字人制作中的关键技术环节。拉普拉斯金字塔适合纹理保持,泊松融合适合光照适应。开发者应根据项目场景选择合适的算法,并结合掩码处理与参数调优,以实现最佳的视觉效果。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online