AI数字人-实现图像无缝融合

在做数字人时,会遇到一个问题,如何把头部说话的视频和原始图片/视频合在一起,这里就涉及到很有意思的图像无缝融合的技术, 我们一起来学习下吧

目录

1. 融合的效果

2. 拉普拉斯金字塔

3. 泊松融合

4. 参考资料

一、融合的效果

拉普拉斯金字塔进行图像融合 基本看不出来是有两类水果图片融合的

使用泊松融合,对生成的头部视频和原视频进行融合

对原图第一帧进行人脸检测和裁剪(具体实现可参考上一篇文章),然后以这个点对人脸进行裁剪,然后根据音频驱动嘴型说话,以及原来的视频眨眼和头部动作作为参考,生成新的头部视频, 最终把生成的头部视频逐帧和源视频进行融合,生成最终带身体和手部动作的视频.

二、拉普拉斯金字塔(Laplacian Pyramid)

2.1 介绍

对图片先逐级进行下采样,然后再逐级进行上采样,通过从高斯金字塔的连续两层之间计算差值来构建的,用于捕获图像在不同尺度下的细节信息

拉普拉斯的用处可以分为两大类, 对图像进行压缩 和对图像进行融合

通过先下采样再上采样,然后对上采样的,得到拉普拉斯金字塔,然后再和逐级上采样的图片进行相加即可恢复为原图, 即是无损的. 如果我们对图片中变化比较小的低频分量进行剔除,只保留更多细节的高频分量(即边缘轮廓),损失一部分不明显的信息,再进行恢复 可以实现图片压缩的效果.

下面我们看下如何通过拉普拉斯金字塔实现图像融合

2.2 图像融合原理以及代码实现

对两张图片进行融合需要一个Mask图,指定从图片中哪些区域需要进行融合,比如文章开头的两种水果的融合,取左边一半进行融合(用全1 白色表示),右边一半进行保留(用全0 黑色表示)

完整代码实现如下

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]:
        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)
        #通过np.newaxis添加一个维度, 把二维的mask图转为和AB图一样三通道的图片
        print(f"gm.ndim:{gm.ndim},gm:{gm.shape},la:{la.shape},lb:{lb.shape}")
        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_

需要注意的是:基于 laplace 金字塔的图像拼接限制挺大的,对两张图片匹配性有很高的要求(尺寸大小以及融合位置)

三、泊松融合(Poisson Blending)

3.1 介绍

泊松融合可以将一个图像区域无缝地融合到另一个图像中,在保持图像渐变的前提下调整图像的像素值,不仅能够保留源图像的细节和结构,又能自然地适应目标图像的颜色和亮度,使得融合区域与周围环境看起来更自热协调。比如下面的融合效果

图片来自:github.com/Erkaman/poi…

3.2 原理和代码实现

泊松融合处理图像的梯度域而非直接在像素值上操作,具体来说,它通过解泊松方程来编辑图像的一个区域,让选择的图像区域无缝地融入到目标图像中,使得融合区域内的梯度与源图像相匹配,同时边界与目标图像平滑对接

泊松融合通常涉及以下步骤:

  1. 选择源图像(要复制的图像)和目标图像(要粘贴到的图像)。

  2. 在源图像上定义一个蒙版,标记出需要融合的区域。

  3. 计算源图像在蒙版区域内的梯度(颜色变化)。

  4. 解决泊松方程,使得融合区域内的梯度与源图像相匹配,同时边界与目标图像平滑对接。

    opencv中封装了seamlessClone接口来实现泊松融合 cv.seamlessClone(src, dst, mask, p, flags[, blend]) ->blend src:输入8位3通道图像(截取目标的大图) dst:输入8位3通道图像(待粘贴融合的目标背景图) mask:输入8位1或3通道图像(目标掩码区域图像) p:对象被放置在目标图像dst中的位置 blend:输出图像,与dst具有相同大小和类型。 flags:克隆方法可以是NORMAL_CLONE,MIXED_CLONE或MONOCHROME_TRANSFER

    NORMAL_CLONE: 不保留dst 图像的texture细节。目标区域的梯度只由源图像决定。 MIXED_CLONE: 保留dest图像的texture 细节。目标区域的梯度是由原图像和目的图像的组合计算出来(计算dominat gradient)。 MONOCHROME_TRANSFER: 不保留src图像的颜色细节,只有src图像的质地,颜色和目标图像一样,可以用来进行皮肤质地填充

使用如下

#resize人脸裁剪并且根据音频驱动生成的视频帧 
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(通过柏松融合实现)的NORMAL_CLONE的类型进行crop_frame和原始图片进行融合
gen_img = cv2.seamlessClone(p, full_img, mask, location, cv2.NORMAL_CLONE)


如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

  • 21
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值