当前位置:首页>编程日记>正文

美颜

 

c++代码:

https://github.com/lrs0304/face_beauty_on_windows

 

python源码:

https://github.com/PerpetualSmile/BeautyCamera

detect  0.05200004577636719
meibai  0.27599501609802246
dermabrasion  0.05503058433532715

import sysimport cv2
import numpy as np
import timeimport window
import window2class MainWindow():def __init__(self):img=cv2.imread("d:/a1.jpg")cv2.imshow("orig", img)self.raw_image=imgstart=time.time()self.faces = self.detect_face()print('detect ',time.time()-start)if self.faces != ():for (x, y, w, h) in self.faces:self.raw_image = self.raw_image[y:y+h,x:x+w]self.imgskin = np.zeros(self.raw_image.shape)# self.raw_image = cv2.rectangle(self.raw_image.copy(), (x, y), (x + w, y + h), (255, 0, 0), 1)self.detect_skin()self.calculated = Truestart = time.time()a=self.whitening_skin(self.raw_image,value=25)print('meibai ', time.time() - start)cv2.imshow("meibai", self.current_img)start = time.time()a = self.dermabrasion()print('dermabrasion ', time.time() - start)img[y:y+h,x:x+w]=self.current_imgcv2.imshow("asd",img)cv2.waitKey()# 饱和度def change_saturation(self):if self.raw_image is None:return 0value = self.ui.horizontalSlider.value()img_hsv = cv2.cvtColor(self.current_img, cv2.COLOR_BGR2HLS)if value > 2:img_hsv[:, :, 2] = np.log(img_hsv[:, :, 2] /255* (value - 1)+1) / np.log(value + 1) * 255if value < 0:img_hsv[:, :, 2] = np.uint8(img_hsv[:, :, 2] / np.log(- value + np.e))self.current_img = cv2.cvtColor(img_hsv, cv2.COLOR_HLS2BGR)# 明度调节def change_darker(self):if self.raw_image is None:return 0value = self.ui.horizontalSlider_4.value()img_hsv = cv2.cvtColor(self.current_img, cv2.COLOR_BGR2HLS)if value > 3:img_hsv[:, :, 1] = np.log(img_hsv[:, :, 1] /255* (value - 1)+1) / np.log(value + 1) * 255if value < 0:img_hsv[:, :, 1] = np.uint8(img_hsv[:, :, 1] / np.log(- value + np.e))self.last_image = self.current_imgself.current_img = cv2.cvtColor(img_hsv, cv2.COLOR_HLS2BGR)# 人脸识别def detect_face(self):img = self.raw_imageface_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 5)return faces# 皮肤识别def detect_skin(self):img = self.raw_imagerows, cols, channals = img.shapefor r in range(rows):for c in range(cols):B = img.item(r, c, 0)G = img.item(r, c, 1)R = img.item(r, c, 2)if (abs(R - G) > 15) and (R > G) and (R > B):if (R > 95) and (G > 40) and (B > 20) and (max(R, G, B) - min(R, G, B) > 15):self.imgskin[r, c] = (1, 1, 1)elif (R > 220) and (G > 210) and (B > 170):self.imgskin[r, c] = (1, 1, 1)# 皮肤磨皮(value1精细度,value2程度)def dermabrasion(self, value1=3, value2=2):# value1 = self.ui.horizontalSlider_14.value()# value2 = 11 - self.ui.horizontalSlider_11.value()if value1 == 0 and value2 == 0:return 0if value2 == 0:value2 = 2if value1 == 0:value1 = 3img = self.current_imgdx = value1 * 5fc = value1 * 12.5p = 50temp1 = cv2.bilateralFilter(img, dx, fc, fc)temp2 = (temp1 - img + 128)temp3 = cv2.GaussianBlur(temp2, (2 * value2 - 1, 2 * value2 - 1), 0, 0)temp4 = img + 2 * temp3 - 255dst = np.uint8(img * ((100 - p) / 100) + temp4 * (p / 100))imgskin_c = np.uint8(-(self.imgskin - 1))dst = np.uint8(dst * self.imgskin + img * imgskin_c)self.current_img = dst# 美白算法(皮肤识别)def whitening_skin(self, img,value=30):# value = 30imgw = np.zeros(img.shape, dtype='uint8')imgw = img.copy()midtones_add = np.zeros(256)for i in range(256):midtones_add[i] = 0.667 * (1 - ((i - 127.0) / 127) * ((i - 127.0) / 127))lookup = np.zeros(256, dtype="uint8")for i in range(256):red = ired += np.uint8(value * midtones_add[red])red = max(0, min(0xff, red))lookup[i] = np.uint8(red)rows, cols, channals = img.shapefor r in range(rows):for c in range(cols):if self.imgskin[r, c, 0] == 1:imgw[r, c, 0] = lookup[imgw[r, c, 0]]imgw[r, c, 1] = lookup[imgw[r, c, 1]]imgw[r, c, 2] = lookup[imgw[r, c, 2]]self.current_img = imgw# 美白算法(人脸识别)def whitening_face(self, value=30):# value = 30value = self.ui.horizontalSlider_8.value()img = self.current_imgimgw = np.zeros(img.shape, dtype='uint8')imgw = img.copy()midtones_add = np.zeros(256)for i in range(256):midtones_add[i] = 0.667 * (1 - ((i - 127.0) / 127) * ((i - 127.0) / 127))lookup = np.zeros(256, dtype="uint8")for i in range(256):red = ired += np.uint8(value * midtones_add[red])red = max(0, min(0xff, red))lookup[i] = np.uint8(red)# faces可全局变量faces = self.facesif faces == ():rows, cols, channals = img.shapefor r in range(rows):for c in range(cols):imgw[r, c, 0] = lookup[imgw[r, c, 0]]imgw[r, c, 1] = lookup[imgw[r, c, 1]]imgw[r, c, 2] = lookup[imgw[r, c, 2]]else:x, y, w, h = faces[0]rows, cols, channals = img.shapex = max(x - (w * np.sqrt(2) - w) / 2, 0)y = max(y - (h * np.sqrt(2) - h) / 2, 0)w = w * np.sqrt(2)h = h * np.sqrt(2)rows = min(rows, y + h)cols = min(cols, x + w)for r in range(int(y), int(rows)):for c in range(int(x), int(cols)):imgw[r, c, 0] = lookup[imgw[r, c, 0]]imgw[r, c, 1] = lookup[imgw[r, c, 1]]imgw[r, c, 2] = lookup[imgw[r, c, 2]]processWidth = int(max(min(rows - y, cols - 1) / 8, 2))for i in range(1, processWidth):alpha = (i - 1) / processWidthfor r in range(int(y), int(rows)):imgw[r, int(x) + i - 1] = np.uint8(imgw[r, int(x) + i - 1] * alpha + img[r, int(x) + i - 1] * (1 - alpha))imgw[r, int(cols) - i] = np.uint8(imgw[r, int(cols) - i] * alpha + img[r, int(cols) - i] * (1 - alpha))for c in range(int(x) + processWidth, int(cols) - processWidth):imgw[int(y) + i - 1, c] = np.uint8(imgw[int(y) + i - 1, c] * alpha + img[int(y) + i - 1, c] * (1 - alpha))imgw[int(rows) - i, c] = np.uint8(imgw[int(rows) - i, c] * alpha + img[int(rows) - i, c] * (1 - alpha))self.current_img = imgw# Gamma矫正def gamma_trans(self):gamma = (self.ui.horizontalSlider_5.value() + 10) / 10img = self.current_imggamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)self.current_img = cv2.LUT(img, gamma_table)self.show_image()self.show_histogram()# 响应滑动条的变化def slider_change(self):if self.raw_image is None:return 0self.current_img = self.raw_image# 伽马变换if self.ui.horizontalSlider_5.value() != 0:self.gamma_trans()# 饱和度if self.ui.horizontalSlider.value() != 0:self.change_saturation()if self.ui.horizontalSlider_2.value() != 0:pass# 边缘保持if self.ui.horizontalSlider_3.value() != 0:self.edge_preserve()# 亮度if self.ui.horizontalSlider_4.value() != 0:self.change_darker()# 美白(人脸识别)if self.ui.horizontalSlider_8.value() != 0:self.whitening_face()# 美白(皮肤识别)if self.ui.horizontalSlider_13.value() != 0:self.whitening_skin()# 磨皮程度if self.ui.horizontalSlider_11.value() != 0:self.dermabrasion()# 磨皮精度if self.ui.horizontalSlider_14.value() != 0:self.dermabrasion()# 风格化if self.ui.horizontalSlider_2.value() != 0:self.stylize()# 细节增强if self.ui.horizontalSlider_6.value() != 0:self.detail_enhance()# 铅笔画if self.ui.horizontalSlider_12.value() != 0:self.pencil_color()self.show_image()# 计算人脸识别和皮肤识别的基本参数def calculate(self):if self.raw_image is None:return 0if self.calculated is False:self.faces = self.detect_face()if self.faces != ():self.detect_skin()self.calculated = True# 怀旧滤镜def reminiscene(self):if self.raw_image is None:return 0if self.ui.horizontalSlider_10.value() == 0:self.current_img = self.raw_imageself.show_image()return 0img = self.raw_image.copy()rows, cols, channals = img.shapefor r in range(rows):for c in range(cols):B = img.item(r, c, 0)G = img.item(r, c, 1)R = img.item(r, c, 2)img[r, c, 0] = np.uint8(min(max(0.272 * R + 0.534 * G + 0.131 * B, 0), 255))img[r, c, 1] = np.uint8(min(max(0.349 * R + 0.686 * G + 0.168 * B, 0), 255))img[r, c, 2] = np.uint8(min(max(0.393 * R + 0.769 * G + 0.189 * B, 0), 255))self.current_img = imgself.show_image()# 木刻滤镜def woodcut(self):if self.raw_image is None:return 0if self.ui.horizontalSlider_9.value() == 0:# self.current_img = self.raw_imageself.show_image()return 0self.gray_image = cv2.cvtColor(self.raw_image, cv2.COLOR_BGR2GRAY)gray = self.gray_imagevalue = 70 + self.ui.horizontalSlider_9.value()rows, cols = gray.shapefor r in range(rows):for c in range(cols):if gray[r, c] > value:gray[r, c] = 255else:gray[r, c] = 0self.gray_image = grayself.show_grayimage()# 铅笔画(灰度)def pencil_gray(self):if self.raw_image is None:return 0if self.ui.horizontalSlider_7.value() == 0:# self.current_img = self.raw_imageself.show_image()return 0value = self.ui.horizontalSlider_7.value() * 0.05dst1_gray, dst1_color = cv2.pencilSketch(self.current_img, sigma_s=50, sigma_r=value, shade_factor=0.04)self.gray_image = dst1_grayself.show_grayimage()# 铅笔画(彩色)def pencil_color(self):if self.raw_image is None:return 0if self.ui.horizontalSlider_12.value() == 0:self.current_img = self.raw_imageself.show_image()return 0value = self.ui.horizontalSlider_12.value() * 0.05dst1_gray, dst1_color = cv2.pencilSketch(self.current_img, sigma_s=50, sigma_r=value, shade_factor=0.04)self.current_img = dst1_color# 风格化def stylize(self):if self.raw_image is None:return 0if self.ui.horizontalSlider_2.value() == 0:self.current_img = self.raw_imageself.show_image()return 0value = self.ui.horizontalSlider_2.value() * 0.05self.current_img = cv2.stylization(self.current_img, sigma_s=50, sigma_r=value)# 细节增强def detail_enhance(self):if self.raw_image is None:return 0if self.ui.horizontalSlider_6.value() == 0:self.current_img = self.raw_imageself.show_image()return 0value = self.ui.horizontalSlider_6.value() * 0.05self.current_img = cv2.detailEnhance(self.current_img, sigma_s=50, sigma_r=value)# 边缘保持def edge_preserve(self):if self.raw_image is None:return 0if self.ui.horizontalSlider_3.value() == 0:self.current_img = self.raw_imageself.show_image()return 0value = self.ui.horizontalSlider_3.value() * 0.05self.current_img = cv2.edgePreservingFilter(self.current_img, flags=1, sigma_s=50, sigma_r=value)if __name__ == "__main__":MainWindow()

 


http://www.coolblog.cn/news/fa1540a51b0286ec.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • HDU 5988 最小费用流
  • Linux软件安装-----apache安装
  • 《看透springmvc源码分析与实践》读书笔记一
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • 通过Spark进行ALS离线和Stream实时推荐
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式