AI 数字人制作中的图像无缝融合技术详解
在构建 AI 数字人时,常需要将头部说话的视频与原始图片/视频进行合成。这一过程的核心在于图像无缝融合技术,它能让合成的区域与原背景自然过渡,消除拼接痕迹。
一、融合效果对比
常见的融合算法包括拉普拉斯金字塔融合和泊松融合。通过这两种方法,可以实现不同尺度下的细节保留或梯度域的自然过渡。
拉普拉斯金字塔融合通常用于处理纹理相似但光照略有差异的图片,而泊松融合则更适合处理边缘需要平滑过渡的场景,如人脸替换。
二、拉普拉斯金字塔 (Laplacian Pyramid)
2.1 原理介绍
拉普拉斯金字塔通过对图片逐级进行下采样,再逐级上采样,利用高斯金字塔连续两层之间的差值来构建。它能捕获图像在不同尺度下的细节信息。
基本流程如下:
- 高斯金字塔构建:对原图反复进行高斯模糊和下采样。
- 拉普拉斯金字塔构建:将上一层的高斯图与当前层上采样的结果相减,得到残差(高频信息)。
- 图像融合:根据掩码(Mask),在不同层级混合两张图像的拉普拉斯分量。
- 重建:从底层开始,逐层上采样并相加,恢复为最终图像。
该过程理论上是无损的,若剔除低频分量仅保留高频分量,则可用于图像压缩。
2.2 代码实现
融合需要一张 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 (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]]
i (num_levels, , -):
LA = cv2.subtract(gpA[i-], fix_size(cv2.pyrUp(gpA[i]), gpA[i-]))
LB = cv2.subtract(gpB[i-], fix_size(cv2.pyrUp(gpB[i]), gpB[i-]))
lpA.append(LA)
lpB.append(LB)
LS = []
la, lb, gm (lpA, lpB, gpM):
gm = fix_size(gm, la)
gm = gm[..., np.newaxis] gm.ndim == gm
la = fix_size(la, gm)
lb = fix_size(lb, gm)
ls = la * gm + lb * ( - gm)
LS.append(ls)
ls_ = LS[]
i (, num_levels + ):
ls_ = fix_size(cv2.pyrUp(ls_), LS[i])
ls_ = cv2.add(ls_, LS[i])
ls_ = fix_size(ls_, A)
ls_ = np.clip(ls_, , ).astype()
ls_


