代码语言:javascript复制
from PIL import Image
import numpy as np
a=np.asarray(Image.open("C:/Users/xpp/Desktop/Lena.png").convert('L')).astype('float')
depth=10.
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('C:/Users/xpp/Desktop/result.png')
print("图像手绘化已完成")
算法:手绘风格图像是将像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的远近程度,设计一个位于图像斜上方的虚拟光源 ,光源相对于图像的俯视角为Elevation,方位角为Azimuth,建立光源对各点梯度值的影响函数,运算出各点的新像素值。