python数据分析与展示-对图像的处理
北理工嵩天老师的慕课课程《python数据分析与展示》学习笔记!
1. 图像的数组表示
图像一般使用RGB色彩模式,即每个像素点的颜色由红(R)、绿(G)、蓝(B)组成。RGB三个颜色通道的变化和叠加得到各种颜色,其中:
R红色:取值范围,0-255
G绿色:取值范围,0-255
B蓝色:取值范围,0-255
PIL(Python Imaging Library)是著名的图片处理第三方库,包含了基本的图像处理、特效合成、滤镜等方法。
安装方法:pip install pillow
引用方法:from PIL import Image
>>> from PIL import Image
>>> import numpy as np
>>> im = np.array(Image.open("E:/campus.JPG"))
>>> print(im.shape,im.dtype)
(2448, 3264, 3) uint8
由上例可以看出,图像是一个三维数组,维度分别为高度、宽度和像素RGB值。
2. 图像的变换
读入图像后,获得像素RGB值,修改后保存为新的文件。
>>> # 续上例
>>> b = [255,255,255] - im
>>> a = Image.fromarray(b.astype('uint8'))
>>> a.save("E:/campus2.JPG")
同样,可以调用转换函数 convert(mode) 先转换色彩模式, convert(‘L’) 可以将一个彩色的图片转换为一个灰度图片!这样得到的数组也不再是一个三维数组,是一个二维数组,其中的每个元素所对应的是灰度值!
>>> from PIL import Image
>>> import numpy as np
>>> a = np.array(Image.open("E:/campus.JPG").convert('L'))
>>> b = 255-a
>>> im = Image.fromarray(b.astype('uint8'))
>>> im.save("E:/campus3.JPG")
3. 图像的手绘效果
手绘效果的几个特征:
1.黑白灰色
2.边界线条较重
3.相同或相近色彩趋于白色
4.略有光源效果
from PIL import Image
import numpy as np
a = np.asarray(Image.open('./beijing.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)
im = Image.fromarray(b.astype('uint8')) #重构图像
im.save('./beijingHD.jpg')