数据分析与展示---图像的手绘效果

一:图像的相关知识了解

 

二:图像的数组表示

三:图像的变换

读入图像后,获取像素RGB值,修改后保存为新的文件

 

 

四:图像的手绘效果案例分析

五:图像手绘实现

from PIL import Image
import numpy as np

a = np.asarray(Image.open("./1.png").convert('L')).astype('float')
print(a.shape)  #灰度图像是二维数组
print(a)    #n行m列,当对于这个行列上的值就是灰度值
depth = 10.             #预设深度值为10,深度值的取值范围可以是0-100
grad = np.gradient(a)   #取图像的梯度值,含行列两个方向的梯度值
grad_x,grad_y = grad  #天气x,y方向的梯度值
grad_x = grad_x*depth/100.  #根据深度调整x,y方向的梯度值
grad_y = grad_y*depth/100.
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)  #将原来的二维变三维归一化z轴值平方为1.-->√(x**2+y**2+z**2)--->就是对角值,三轴分别初一即可得归一化值
uni_x = grad_x/A  #获得归一化x,都是小于1的
uni_y = grad_y/A  #获得归一化y
uni_z = 1./A  #获得归一化z

vec_el = np.pi/2.2  #光源的俯视角度,弧度值(我们自己定义的∏/2.2接近90°)
vec_az = np.pi/4.  #光源的方位角度,弧度值(我们自己定义的∏/4接近45°)
dx = np.cos(vec_el)*np.cos(vec_az)  #光源对x轴的影响,都是小于1  就是三维空间三角函数运算
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)    #光源归一化,需要乘以255
b = b.clip(0,255)  #防止值溢出0-255,需要进行截取

im = Image.fromarray(b.astype("uint8")) #重构图像
im.save("./2.png")

 

 

 

posted @ 2018-07-11 08:08  山上有风景  阅读(632)  评论(0编辑  收藏  举报