Fork me on GitHub

python-转手绘


用numpy和PIL库进行图像变换。

灰度化

一张图片无非就是个二维数组,其中的每个元素又是一个三元组[R,G,B],改变RGB的值也就改变了图片的色调。

1
2
3
4
5
6
7
8
9
10
11
12
13
from PIL import Image
import numpy as np
a = np.array(Image.open('test.jpg').convert('L')) #二维数组里存储的将不再是RGB,而只有灰度值
print(a.shape,a.dtype) #获取图片的二维数组大小和格式
#不同的变化
#b = 255 - a
#b = (100/255)*a+150
b = 255*(a/255)**2
im = Image.fromarray(b.astype('uint8'))
im.save('result.jpg')

转手绘效果

不只是PS可以这样,用python也可以。

手绘效果其实就是由立体效果和明暗效果叠加而成的。

灰度表示的是图像的明暗变化,而梯度表示的是灰度的变化率,所以可以通过调整像素之间的梯度值来改变明暗程度。

立体效果则通过添加虚拟深度值来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from PIL import Image
import numpy as np
a = np.asarray(Image.open('test.jpg').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) #防止数据越界,将生成的灰度值裁剪至0-255
im = Image.fromarray(b.astype('uint8')) #重构图像
im.save('result.jpg')

原图:

原图

手绘效果:

手绘效果

donate the author