前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python-转手绘

python-转手绘

作者头像
luxuantao
发布2021-02-24 11:25:51
3830
发布2021-02-24 11:25:51
举报
文章被收录于专栏:Fdu弟中弟Fdu弟中弟

用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')

原图:

原图
原图

手绘效果:

手绘效果
手绘效果
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 灰度化
  • 转手绘效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档