生活中我们也常常喜欢通过更换头像的方式,来表达自己的感受和心情,高兴时,难过时,每时每刻我们的头像都可以成为我们心情的代名词。
虽然我们不能使用一支铅笔,通过黑白线条的勾勒,描绘出一幅幅生动形象的人物形象。但是我们可以通过Python程序来完成。
首先我们需要执行以下命令安装需要的模块
pip install numpy
pip install pillow
安装完成后如图1所示。
图1 安装numpy
我们先导入安装的模块,并打开需要转换的图片,将其转换为灰度图,示例代码如下
01 from PIL import Image # 图像处理模块
02 import numpy as np
03
04 # 将图像以灰度图的方式打开并将数据转为float存入np中
05 a = np.asarray(Image.open("sucai.png").convert('L')).astype('float')
06 depth = 10. # (0-100)
07 grad = np.gradient(a) # 取图像灰度的梯度值
08 grad_x, grad_y = grad # 分别取横纵图像梯度值
09 grad_x = grad_x * depth 100.
10 grad_y = grad_y * depth 100.
11
12 A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
13 uni_x = grad_x A
14 uni_y = grad_y A
15 uni_z = 1. / A
然后我们再建立一个位于图像斜上方的虚拟光源,并计算图像中各点新的像素值,最后保存图片即可,代码如下
16 # 建立一个位于图像斜上方的虚拟光源
17 vec_el = np.pi 2.2 # 光源的俯视角度,弧度值
18 vec_az = np.pi 4. # 光源的方位角度,弧度值
19 dx = np.cos(vec_el) * np.cos(vec_az) # 光源对x 轴的影响
20 dy = np.cos(vec_el) * np.sin(vec_az) # 光源对y 轴的影响
21 dz = np.sin(vec_el) # 光源对z 轴的影响
22
23 # 计算各点新的像素值
24 b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 光源归一化
25 b = b.clip(0, 255) # clip函数将区间外的数字剪除到区间边缘
26 im = Image.fromarray(b.astype('uint8')) # 重构图像
27
28 # 保存图片
29 im.save("sucai_sketch.png")
素材转换后的对比图如下所示
今天的技巧你学会了吗?
更多技术干货,请持续 哦
Powered by 小羊羔外链网 8.3.11
©2015 - 2024 小羊羔外链网
您的IP:3.15.5.183,2024-04-19 21:20:11,Processed in 0.05565 second(s).