绘制手绘风格图片
基本原理
源代码
from PIL import Image
import numpy as np
a = np.asarray(Image.open("D:/日常撸代码/Python数据分析与展示/210317/猫片.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
uniz_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*uniz_z)#梯度还原为灰度
b=b.clip(0,255)
im = Image.fromarray(b.astype('uint8'))
im.save("D:/日常撸代码/Python数据分析与展示/210317/猫片1.jpg")
导入包,导入图片
from PIL import Image
import numpy as np
a = np.asarray(Image.open("D:/日常撸代码/Python数据分析与展示/210317/猫片.jpg").convert('L')).astype('float')
使用Image.open来打开图片,使用convert将图片的RGB值转换为灰度值,其中灰度值设置为浮点数
梯度的重构
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
gradient函数获取图片横纵坐标轴的梯度值(梯度值代表相邻两个数的变化率),通过梯度值可以反映图片整体的明暗变换,梯度值*10/100,将梯度值归一化。
光源效果
设置光源效果
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轴影响
梯度归一化
A = np.sqrt(grad_x**2+grad_y**2+1.)
uni_x=grad_x/A
uni_y=grad_y/A
uniz_z = 1./A
b=255*(dx*uni_x+dy*uni_y+dz*uniz_z)#梯度还原为灰度
uni_x,uni_y代表光线的影响
图像生成
b=b.clip(0,255)
im = Image.fromarray(b.astype('uint8'))
im.save("D:/日常撸代码/Python数据分析与展示/210317/猫片1.jpg")
![](https://www.icode9.com/i/l/?n=20&i=blog/2269871/202103/2269871-20210318095710641-1076710403.jpg)
clip函数可避免出现个别像素的灰度值大于255的情况