Fork me on GitHub

利用python图形库把图片转换成素描图

最近在学习Python的路上,写点东西分享吧

如图

前言

最近在mooc上面学习python语言和爬虫,然后那个BIT教授在介绍python的一些好玩的玩法的时候,突然讲到把一个照片生成素描画的操作。顿时觉得很骚,然后就去学习了一手,想起了陈lao前几天拿着python的字符画在窝的面前装逼,装逼地址,于是窝很愤怒,也去学了一手python。

正文

希望大家能学到这个好玩的技能QAQ。

用到的库

1
pillow(Image)+numpy库

安装库

安装方法如图:
如图

对图片进行黑白变换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from PIL import Image
import numpy as np
a=np.array(Image.open('saber.jpg').convert('L')) #.convert将图片变成黑白的
b=255-a #在对应的颜色通道减去他自己变成黑白底片的效果
im=Image.fromarray(b.astype('uint8'))
im.save('saber1.jpg')
c=(100/255)*a+150#区间变换,颜色比较淡的灰度的图片
im=Image.fromarray(c.astype('uint8'))
im.save('saber2.jpg')
d=255*(a/255)**2#像素平方,颜色比较深的图
im=Image.fromarray(d.astype('uint8'))
im.save('saber3.jpg')

图像手绘效果变换的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from PIL import Image
import numpy as np
a=np.array(Image.open(r'D:\saber.jpg').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.sin(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(r'D:\saber1.jpg')

总结

没陈lao那么能水,这个代码挺简单的,很好看的。

-------------本文结束感谢您的阅读-------------