数据分析与展示——图像手绘效果实现
NumPy库入门
NumPy数据存取和函数
实例:图像的数组表示
图像的RGB色彩模式
图像一般使用RGB色彩模式,即每个像素点的颜色由红(R)、绿(G)、蓝(B)组成。
RGB三个颜色通道的变化和叠加得到各种颜色,取值都为0-255。RGB形成的颜色包括了人类视力所能感知的所有颜色。
PIL(Python Image Library)库
PIL库是一个具有强大图像处理能力的第三方库。在命令行下的安装方法:pip install pillow
from PIL import Image
Image是PIL库中代表一个图像的类(对象)
图像是一个由像素组成的二维矩阵,每个元素是一个RGB值。
范例:将数组转化为ndarray数组
In [1]: from PIL import Image In [2]: import numpy as np In [3]: im = np.array(Image.open("E:/tiger.jpg")) In [4]: print(im.shape,im.dtype) (435, 428, 3) uint8
图像是一个三维数组,维度分别是高度、宽度和像素RGB值。
图像的变换
读入图像后,获得像素RGB值,修改后保存为新的文件。
范例:修改图像并另存
In [5]: b = [255,255,255] - im In [6]: new_im = Image.fromarray(b.astype('uint8')) In [7]: new_im.save("E:/tiger1.jpg") In [8]: a = np.array(Image.open("E:/tiger.jpg").convert('L')) # 使用灰度表示图像 In [9]: b = 255 - a In [10]: im = Image.fromarray(b.astype('uint8')) In [11]: im.save("E:/tiger2.jpg") In [12]: c = (100/255)*a +150 # 区间变换 In [13]: im = Image.fromarray(c.astype('uint8')) In [14]: im.save("E:/tiger3.jpg") In [15]: d = 255 * (a/255)**2 # 像素平方 In [16]: im = Image.fromarray(d.astype('uint8')) In [17]: im.save("E:/tiger4.jpg")
tiger.jpg tiger1.jpg tiger2.jpg tiger3.jpg tiger4.jpg
“图像的手绘效果”实例分析
手绘效果特征:
- 黑白灰色
- 边界线条较重
- 相同或相近色彩趋于白色
- 略有光源效果
图像手绘效果实现代码:
from PIL import Image import numpy as np a = np.asarray(Image.open('E:/tiger.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('E:/tiger0.jpg')
tiger0.jpg