Python实现PhotoShop人脸液化变形效果

这篇博客介绍了如何利用dlib库和OpenCV进行人脸关键点检测,然后通过图像局部平移算法实现让人脸‘笑’起来的效果。具体步骤包括检测人脸关键点、划定嘴角区域、应用局部平移算法以及双线性插值法合成新像素。代码示例展示了如何实现实时的人脸微笑调整。

在PhotoShop中,我们经常利用液化工具的向前工具来对人脸进行形变处理,例如瘦脸、放大眼睛等常规P图操作。

瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping。这篇论文详细描述了算法原理,并提供了伪码实现。

图像局部扭曲算法有三个:局部缩放(Local Scaling)算法、局部平移(Local Transition)算法和局部旋转(Local Rotation)算法。其中应用局部缩放算法可实现眼睛放大,局部平移算法则可用于实现瘦脸效果。下面来应用图像局部平移算法让一张图片“笑”起来,其背后原理和瘦脸原理如出一辙。

实现效果

在这里插入图片描述

具体实现步骤

  • 利用dlib库的人脸关键点检测器检测出人脸的68个关键点,其68个特征点在人脸中的位置和在关键点序列中的次序如下

    在这里插入图片描述

  • 划定一个圆形选区,一般是要让哪里的局部图像变形就在哪里划定圆形选取,因为这里要让人脸“笑”起来,所以分别在关键点49、60(左嘴角)和55、56(右嘴角)之间划定圆形选区

  • 对于圆形选区里的每一像素,取出其R,G,B各分量,存入3个变量(r, g, b)中(也即,三个变量分别存储选区内的原图像的R,G,B三个通道的数值)

  • 对于圆形选区里的每一个像素U

  • 根据图像局部平移算法公式的映射关系,算出它变形后的位置坐标X(实际运算过程采取逆运算,即由变形后坐标X推出变形前坐标U)

在这里插入图片描述

  • 用双线性插值方法,根据U的位置,和r, g, b中的数值,计算U所在位置处的R,G,B等分量,将R,G,B等分量合成新的像素,作为X处的像素值(bilinearInsert方法)

代码实现(代码已附上详细注释)

import dlib
import cv2
import numpy as np
import math
import matplotlib.pyplot as plt


class FaceAdjust():
    def __init__(self):

        self.predictor_path = "dat/shape_predictor_68_face_landmarks.dat"
        #获取人脸框检测器
        self.detector = dlib.get_frontal_face_detector()
        #获取人脸关键点检测器
        self.predictor = dlib.shape_predictor(self.predictor_path)


    def landmark_dec_dlib_fun(self,img_src):
        img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
        #用于绘制人脸关键点的img
        img_tag = img_src.copy()

        land_marks = []
        rects = self.detector(img_gray, 0)

        for i in range(len(rects)):
            #把人脸关键点列表转为矩阵保存至列表中
            land_marks_node = np.matrix([[p.x, p.y] for p in self.predictor(img_gray, rects[i]).parts()])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值