绘制手绘风格图片

绘制手绘风格图片

绘制手绘风格图片

基本原理

源代码

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的情况

绘制手绘风格图片
绘制手绘风格图片

上一篇:深度学习中的计算图整理与总结


下一篇:卷积网络的可视化解释-类激活映射