磨皮美白搞笑图片处理

v(1)PIL库自我学习总结
Hello!今天我们来学习一下这个神奇的图片处理的第三方函数库——PIL库

(本blog部分图片及代码来自网络)

这是一个支持图像存储、显示和处理的函数库,它能够处理几乎所有图像格式,可以完成对图像的缩放、裁剪、叠加以及图像添加条纹,文字等信息等的操作。

首先是利用pip下载一个:

它有许多子库,例如:Image、ImageChops、ImageDraw等等,他们各有神通,发挥着自己的作用,

首先我们当然学习的是经典的Image子库;

方法 描述
Image.open(filename) 根据参数加载图像文件
Image.new(mode,size,color) 根据给定参数创建一个新的图像
Image.open(StringIO.StringIO(buffer)) 从字符串中获取图像
Image.frombytes(mode,size,data) 根据像素点data创建图像
Image.verify() 对图像文件完整性进行检查,返回异常

常用函数

读取一张图片:

im=Image.open(‘test.jpg’)

显示一张图片:

im.show()

保存图片:

im.save(“save.gif”,“GIF”) #保存图像为gif格式

查看图像信息

im.format, im.size, im.mode

图片裁剪:
box=(100,100,500,500)

#设置要裁剪的区域

region=im.crop(box) #此时,region是一个新的图像对象。

改变图像的大小

out=img.resize((128,128))#resize成128*128像素大小

旋转图像

out=img.rotate(45) #逆时针旋转45度

图像类型转换

im=im.convert(“RGBA”)

美白磨皮实现原理

大神提供的算法:
Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
大神本神传送门,该算法其实是对 PS 的一种磨皮方案的脚本实现。

Python + OpenCV 实现
网上看到的一个基于上述公式的 python 实现方案beauty_face,但是他再线性光叠加时出错,修正后如beauty_face2(由于对Python矩阵运算不熟悉使用了比较笨的方法实现), 具体见代码:

#!/bin/python

祛痘美白

import numpy as np
import cv2

def beauty_face(img):
‘’’
Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
https://my.oschina.net/wujux/blog/1563461
‘’’

dst = np.zeros_like(img)
#int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定
v1 = 3
v2 = 1
dx = v1 * 5 # 双边滤波参数之一 
fc = v1 * 12.5 # 双边滤波参数之一 
p = 0.1

temp4 = np.zeros_like(img)

temp1 = cv2.bilateralFilter(img,dx,fc,fc)
temp2 = cv2.subtract(temp1,img)
temp2 = cv2.add(temp2,(10,10,10,128))
temp3 = cv2.GaussianBlur(temp2,(2*v2 - 1,2*v2-1),0)
temp4 = cv2.add(img,temp3)
dst = cv2.addWeighted(img,p,temp4,1-p,0.0)
dst = cv2.add(dst,(10, 10, 10,255))
return dst

def beauty_face2(src):
‘’’
Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
‘’’

dst = np.zeros_like(src)
#int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定
v1 = 3
v2 = 1
dx = v1 * 5 # 双边滤波参数之一 
fc = v1 * 12.5 # 双边滤波参数之一 
p = 0.1

temp4 = np.zeros_like(src)

temp1 = cv2.bilateralFilter(src,dx,fc,fc)
temp2 = cv2.subtract(temp1,src)
temp2 = cv2.add(temp2, (10,10,10,128))
temp3 = cv2.GaussianBlur(temp2,(2*v2 - 1,2*v2-1),0)
temp4 = cv2.subtract(cv2.add(cv2.add(temp3, temp3), src), (10, 10, 10, 255))

dst = cv2.addWeighted(src,p,temp4,1-p,0.0)
dst = cv2.add(dst, (10, 10, 10,255))
return dst

def init():
img = cv2.imread(‘testimg.jpg’)

# blur1 = cv2.GaussianBlur(img, (5,5),0)
# blur2 = cv2.bilateralFilter(img, 9 , 75, 75)
blur3 = beauty_face(img)
blur4 = beauty_face2(img)

cv2.imshow('image0', img)
# cv2.imshow('image1', blur1)
# cv2.imshow('image2', blur2)
cv2.imshow('image3', blur3)
cv2.imshow('image4', blur4)

#cv2.namedWindow('image', cv2.WINDOW_NORMAL)
#cv2.resizeWindow('image', 1000, 1000) #定义frame的大小

cv2.waitKey(0)
cv2.imwrite('result1.png', blur3)
cv2.imwrite('result2.png', blur4)
cv2.destroyAllWindows()

if name == “main”:
init()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值