python-转手绘

2021-02-24 11:25:51 浏览数 (1)


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

灰度化

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

代码语言:javascript复制
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也可以。

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

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

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

代码语言:javascript复制
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')

原图:

手绘效果:

0 人点赞