瘦脸实现【Python】
对实现人脸瘦脸简单功能的一个记录,大概流程如下:
1.使用dlib检测出人脸关键点
2.使用Interactive Image Warping 局部平移算法实现瘦脸
瘦脸的原理可以参照这篇博客https://blog.csdn.net/grafx/article/details/70232797?locationNum=11&fps=1
下载地址:https://download.csdn.net/download/u011941438/10646628,可耻求2分。但以下代码再下个shape_predictor_68_face_landmarks.dat就可以直接执行了
ps:利用c语言扩展加速
给出代码:
#-*- coding:gb18030 -*-import dlib
import cv2
import numpy as np
import math
predictor_path='shape_predictor_68_face_landmarks.dat'#使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)def landmark_dec_dlib_fun(img_src):img_gray = cv2.cvtColor(img_src,cv2.COLOR_BGR2GRAY)land_marks = []rects = detector(img_gray,0)for i in range(len(rects)):land_marks_node = np.matrix([[p.x,p.y] for p in predictor(img_gray,rects[i]).parts()])# for idx,point in enumerate(land_marks_node):# # 68点坐标# pos = (point[0,0],point[0,1])# print(idx,pos)# # 利用cv2.circle给每个特征点画一个圈,共68个# cv2.circle(img_src, pos, 5, color=(0, 255, 0))# # 利用cv2.putText输出1-68# font = cv2.FONT_HERSHEY_SIMPLEX# cv2.putText(img_src, str(idx + 1), pos, font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)land_marks.append(land_marks_node)return land_marks'''
方法: Interactive Image Warping 局部平移算法
'''def localTranslationWarp(srcImg,startX,startY,endX,endY,radius):ddradius = float(radius * radius)copyImg = np.zeros(srcImg.shape, np.uint8)copyImg = srcImg.copy()# 计算公式中的|m-c|^2ddmc = (endX - startX) * (endX - startX) + (endY - startY) * (endY - startY)H, W, C = srcImg.shapefor i in range(W):for j in range(H):#计算该点是否在形变圆的范围之内#优化,第一步,直接判断是会在(startX,startY)的矩阵框中if math.fabs(i-startX)>radius and math.fabs(j-startY)>radius:continuedistance = ( i - startX ) * ( i - startX) + ( j - startY ) * ( j - startY )if(distance < ddradius):#计算出(i,j)坐标的原坐标#计算公式中右边平方号里的部分ratio=( ddradius-distance ) / ( ddradius - distance + ddmc)ratio = ratio * ratio#映射原位置UX = i - ratio * ( endX - startX )UY = j - ratio * ( endY - startY )#根据双线性插值法得到UX,UY的值value = BilinearInsert(srcImg,UX,UY)#改变当前 i ,j的值copyImg[j,i] =valuereturn copyImg#双线性插值法
def BilinearInsert(src,ux,uy):w,h,c = src.shapeif c == 3:x1=int(ux)x2=x1+1y1=int(uy)y2=y1+1part1=src[y1,x1].astype(np.float)*(float(x2)-ux)*(float(y2)-uy)part2=src[y1,x2].astype(np.float)*(ux-float(x1))*(float(y2)-uy)part3=src[y2,x1].astype(np.float) * (float(x2) - ux)*(uy-float(y1))part4 = src[y2,x2].astype(np.float) * (ux-float(x1)) * (uy - float(y1))insertValue=part1+part2+part3+part4return insertValue.astype(np.int8)def face_thin_auto(src):landmarks = landmark_dec_dlib_fun(src)#如果未检测到人脸关键点,就不进行瘦脸if len(landmarks) == 0:returnfor landmarks_node in landmarks:left_landmark= landmarks_node[3]left_landmark_down=landmarks_node[5]right_landmark = landmarks_node[13]right_landmark_down = landmarks_node[15]endPt = landmarks_node[30]#计算第4个点到第6个点的距离作为瘦脸距离r_left=math.sqrt((left_landmark[0,0]-left_landmark_down[0,0])*(left_landmark[0,0]-left_landmark_down[0,0])+(left_landmark[0,1] - left_landmark_down[0,1]) * (left_landmark[0,1] - left_landmark_down[0, 1]))# 计算第14个点到第16个点的距离作为瘦脸距离r_right=math.sqrt((right_landmark[0,0]-right_landmark_down[0,0])*(right_landmark[0,0]-right_landmark_down[0,0])+(right_landmark[0,1] -right_landmark_down[0,1]) * (right_landmark[0,1] -right_landmark_down[0, 1]))#瘦左边脸thin_image = localTranslationWarp(src,left_landmark[0,0],left_landmark[0,1],endPt[0,0],endPt[0,1],r_left)#瘦右边脸thin_image = localTranslationWarp(thin_image, right_landmark[0,0], right_landmark[0,1], endPt[0,0],endPt[0,1], r_right)#显示cv2.imshow('thin',thin_image)cv2.imwrite('thin.jpg',thin_image)def main():src = cv2.imread('timg4.jpg')cv2.imshow('src', src)face_thin_auto(src)cv2.waitKey(0)if __name__ == '__main__':main()
效果如下:
原图:
瘦脸后的图:
ps:照片来自网络,若有侵权请告知!
瘦脸实现【Python】相关推荐
- 简易版“美颜”来了!肝了一夜!用Python做一个高瘦脸神器!
"菜鸟学Python",第"519"篇原创 如今的网络时代,许多直播的博主们,在进行 直播时,都喜欢利用美颜的方式来提升自己的颜值.其中必不可少的就是瘦脸. 瘦 ...
- Python与MySQL数据库的交互实战
作者 | Huang supreme 编辑 | 郭芮 图源 | 视觉中国 安装PyMySQL库 如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接 ...
- python自动修图_程序员不会用PS给女朋友修图?没关系,用Python十行代码轻松搞定-站长资讯中心...
虽然P图 最好的还是用要学会使用PS,但是并不是每个人都会PS的,但是如果你会Python的话,也是可以为所欲为! 现代社会,不P图的人简直就像是恐龙一样稀奇,大到瘦脸瘦腿瘦全身,小到滤镜大眼高鼻梁, ...
- python做图片美化_Python实现简单的照片磨皮(照片智能磨皮) 最新免费版
Python实现简单的照片磨皮(照片智能磨皮)是一款用python写的最好的照片磨皮软件.需要配置opencv和numpy,使用的时候地址需要加英文的引号,斜杠要用双斜杠,例如"D:\\a. ...
- Python人脸识别——从入门到工程实践
参考书籍:<Python人脸识别从入门到工程实践> 全书共8章: 第 1 章:介绍了人脸识别的基础知识和必备常识: 第 2~4 章:详细讲解了与人脸识别相关的数学.机器学习.计算机视觉.O ...
- 数字图像处理-美图秀秀:瘦脸算法
简介 本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法 对于一些matlab较难实现的算法采用C++或python来实现 ⭐️ github地址: ...
- C++ / Opencv 简单实现美颜效果(瘦脸、大眼、磨皮等)
最近项目需要用到美颜的一些效果,因此开始接触opencv 计算机视觉库,在腾讯课堂上找到一个简单且免费的入门视频<Opencv4 快速入门视频30讲>,看完视频后,初步才对opencv 有 ...
- python实现p图软件_这才是Python程序员P图的正确打开方式!
[IT168 评论]现代社会,不P图的人简直就像是恐龙一样稀奇,大到瘦脸瘦腿瘦全身,小到滤镜大眼高鼻梁,五花八门的手段令人应接不暇.那么程序员作为这个星球的特殊物种,P图才不会用毁图秀秀这种软件,下面 ...
- 基于移动最小二乘(MLS)的图像扭曲刚性变形python实现
基于移动最小二乘(MLS)的图像扭曲刚性变形python实现 简单介绍一下基于mls的图像变形 直接上代码 用来做的一个瘦脸前后对比 写在后面 简单介绍一下基于mls的图像变形 先假设我们的图片像素为 ...
最新文章
- 分布式之elk日志架构的演进
- Mac下使用svn命令
- linux svn磁盘空间满,Linux svn checkout时候总报设备上没有空间
- r生成新的dataframe_2020-08-11R语言中dataframe与list的转换方法
- IrregularGridCollectionView处理不定宽度的标签cell
- java 快捷工具,如何清理不需要的引用
- android电视怎么升级失败,智能电视升级失败,原因都在这里!
- .net core精彩实例分享 -- 字符串处理
- mysql decimal 上限_关于mysql的decimal类型的外键的一个特殊限制
- 10.数据管理(内存,文件锁)
- GTJ2018如何导出全部工程量_新清单计量规范征求意见稿第二期来啦!来看看那些让你烦恼的操作如何解决...
- linux mysql配置_Linux下MySQL安装配置 MySQL配置参数详解
- 小程序使用绑定手机号码接口显示失败
- pbs转换html,pbs 脚本实例说明.docx
- echarts立体柱状图
- Web前端开发精品课HTML与CSS基础教程 (莫振杰著) 完整pdf扫描版
- 抽象类与接口的异同点
- signature=506ccff074d130c2e8d4e3268d3b44f1,Secure proxy signature schemes from the Weil pairing
- sem竞价账户怎么提升效果提高转化
- 一种万能解锁的解决方法