对实现人脸瘦脸简单功能的一个记录,大概流程如下:

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】相关推荐

  1. 简易版“美颜”来了!肝了一夜!用Python做一个高瘦脸神器!

    "菜鸟学Python",第"519"篇原创 如今的网络时代,许多直播的博主们,在进行 直播时,都喜欢利用美颜的方式来提升自己的颜值.其中必不可少的就是瘦脸. 瘦 ...

  2. Python与MySQL数据库的交互实战

    作者 | Huang supreme 编辑 | 郭芮 图源 | 视觉中国 安装PyMySQL库 如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接 ...

  3. python自动修图_程序员不会用PS给女朋友修图?没关系,用Python十行代码轻松搞定-站长资讯中心...

    虽然P图 最好的还是用要学会使用PS,但是并不是每个人都会PS的,但是如果你会Python的话,也是可以为所欲为! 现代社会,不P图的人简直就像是恐龙一样稀奇,大到瘦脸瘦腿瘦全身,小到滤镜大眼高鼻梁, ...

  4. python做图片美化_Python实现简单的照片磨皮(照片智能磨皮) 最新免费版

    Python实现简单的照片磨皮(照片智能磨皮)是一款用python写的最好的照片磨皮软件.需要配置opencv和numpy,使用的时候地址需要加英文的引号,斜杠要用双斜杠,例如"D:\\a. ...

  5. Python人脸识别——从入门到工程实践

    参考书籍:<Python人脸识别从入门到工程实践> 全书共8章: 第 1 章:介绍了人脸识别的基础知识和必备常识: 第 2~4 章:详细讲解了与人脸识别相关的数学.机器学习.计算机视觉.O ...

  6. 数字图像处理-美图秀秀:瘦脸算法

    简介 本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法 对于一些matlab较难实现的算法采用C++或python来实现 ⭐️ github地址: ...

  7. C++ / Opencv 简单实现美颜效果(瘦脸、大眼、磨皮等)

    最近项目需要用到美颜的一些效果,因此开始接触opencv 计算机视觉库,在腾讯课堂上找到一个简单且免费的入门视频<Opencv4 快速入门视频30讲>,看完视频后,初步才对opencv 有 ...

  8. python实现p图软件_这才是Python程序员P图的正确打开方式!

    [IT168 评论]现代社会,不P图的人简直就像是恐龙一样稀奇,大到瘦脸瘦腿瘦全身,小到滤镜大眼高鼻梁,五花八门的手段令人应接不暇.那么程序员作为这个星球的特殊物种,P图才不会用毁图秀秀这种软件,下面 ...

  9. 基于移动最小二乘(MLS)的图像扭曲刚性变形python实现

    基于移动最小二乘(MLS)的图像扭曲刚性变形python实现 简单介绍一下基于mls的图像变形 直接上代码 用来做的一个瘦脸前后对比 写在后面 简单介绍一下基于mls的图像变形 先假设我们的图片像素为 ...

最新文章

  1. 分布式之elk日志架构的演进
  2. Mac下使用svn命令
  3. linux svn磁盘空间满,Linux svn checkout时候总报设备上没有空间
  4. r生成新的dataframe_2020-08-11R语言中dataframe与list的转换方法
  5. IrregularGridCollectionView处理不定宽度的标签cell
  6. java 快捷工具,如何清理不需要的引用
  7. android电视怎么升级失败,智能电视升级失败,原因都在这里!
  8. .net core精彩实例分享 -- 字符串处理
  9. mysql decimal 上限_关于mysql的decimal类型的外键的一个特殊限制
  10. 10.数据管理(内存,文件锁)
  11. GTJ2018如何导出全部工程量_新清单计量规范征求意见稿第二期来啦!来看看那些让你烦恼的操作如何解决...
  12. linux mysql配置_Linux下MySQL安装配置 MySQL配置参数详解
  13. 小程序使用绑定手机号码接口显示失败
  14. pbs转换html,pbs 脚本实例说明.docx
  15. echarts立体柱状图
  16. Web前端开发精品课HTML与CSS基础教程 (莫振杰著) 完整pdf扫描版
  17. 抽象类与接口的异同点
  18. signature=506ccff074d130c2e8d4e3268d3b44f1,Secure proxy signature schemes from the Weil pairing
  19. sem竞价账户怎么提升效果提高转化
  20. 一种万能解锁的解决方法

热门文章

  1. qt实现一个简易的计算器
  2. Autojs连接电脑
  3. python中pu是什么_pu · PyPI
  4. UVA 116 Unidirectional TSP (白书dp)
  5. 红黑树的删除操作详解
  6. 流过平板的超声速流动的CFD计算(附完整代码)
  7. c++哈利波特游戏(1.0.00.11版)
  8. 基于Redis的分布式限流详解
  9. Chrome浏览器无法安装插件的解决办法
  10. 暑期预习IB数学/化学/物理/经济书籍推荐