女朋友嘲笑我没有艺术气息,我不服!!一气之下我用python画素描人像
写在前面
都说5月20日是网络情人节,作为程序员的李伟,平时忙着敲代码,难得有时间可以陪女朋友,然而却收来女朋友的一条消息。。
伟哥这仅有的几根头发多少有点绿光啊哈哈!!!心里想,哪能受得了这种气!!不就是艺术气息吗?伟哥疯狂敲了30行代码,将女朋友的照片一处理,直接发过去了。生活真不容易啊,程序员也得学素描。
照片处理之前 | 照片处理之后 |
---|---|
废话不多说,直接上代码。
代码实现
需要安装的库
PIL 用于对图片的灰度处理
numpy 用于数据分析
安装库命令
pip install PIL
pip install numpy
程序源码
其中:
- beforeUrl指定你要处理的照片,如:
D:\a.jpg
- afterUrl指定你处理完的照片的地址,如:
D:\b.jpg
from PIL import Image
import numpy as np
def makeSketch(beforeUrl,afterUrl):
a = np.asarray(Image.open(beforeUrl).convert('L')).astype('float')
depth = 10. # (0-100)
grad = np.gradient(a) # 取图像灰度的梯度值
grad_x, grad_y = grad # 分别取横纵图像梯度值
grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100.
A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1. / A
vec_el = np.pi / 2.2 # 光源的俯视角度,弧度值
vec_az = np.pi / 4. # 光源的方位角度,弧度值
dx = np.cos(vec_el) * np.cos(vec_az) # 光源对x 轴的影响
dy = np.cos(vec_el) * np.sin(vec_az) # 光源对y 轴的影响
dz = np.sin(vec_el) # 光源对z 轴的影响
b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 光源归一化
b = b.clip(0, 255)
im = Image.fromarray(b.astype('uint8')) # 重构图像
im.save(afterUrl)
if __name__ == '__main__':
beforeUrl = r'D:\1.jpg'
afterUrl = r'D:\2.jpg'
makeSketch(beforeUrl,afterUrl)
项目参考github开源项目,项目地址:https://github.com/stormdony/python_demo/blob/master/Pic_to_sketch/test.py
总结
其实照片是我的女朋友哈哈,但我可没被绿!总之,不管是学艺术也好,写程序也好,都有各自的浪漫之处,虽然有时候呈现的形式不一样,但爱是一样的,祝各位5.20都有所爱之人在身边。