图像数组表示和PIL库
图像一般使用RGB色彩模式,即每个像素点的颜色由红®、绿(G)、蓝(B)组成,RGB三个颜色通道的变化和叠加得到各种颜色,其中R、G、B的取值范围都是0‐255,RGB形成的颜色包括了人类视力所能感知的所有颜色。
图像是一个由像素组成的二维矩阵,每个元素是一个RGB值,或者说图像是一个三维数组,维度分别是高度、宽度和像素RGB值。
PIL库是一个具有强大图像处理能力的第三方库。
在命令行下的安装方法:
pip install pillow
导入PIL库中代表一个图像的类(对象)
from PIL import Image
图像的变换
包括导入图像、图像操作、结果保存,可以利用PIL库的open(dir)、save()函数实现导入和保存操作。
图像手绘效果实例
手绘效果的几个特征:图像中只有黑白灰色、边界线条较重、相同或相近色彩趋于白色、略有光源效果。
想要实现手绘效果主要步骤包括:梯度重构、梯度归一化、光源模拟、图像生成。
梯度重构
利用像素之间的梯度值和虚拟深度值对图像进行重构根据灰度变化来模拟人类视觉的远近程度。这时候就要用到numpy中的梯度函数。
depth = 10
grad = np.gradient(a)
grad_x, grad_y = grad
grad_x = grad_x * depth / 100
grad_y = grad_y * depth / 100
梯度归一化
构造x和y轴梯度的三维归一化单位坐标系。
A = np.sqrt(grad_x**2 + grad_y**2 + 1)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1 / A
光源效果
据灰度变化来模拟人类视觉的远近程度
设计一个位于图像斜上方的虚拟光源,光源相对于图像的俯视角为Elevation,方位角为Azimuth,建立光源对个点梯度值的影响函数,运算出各点的新像素值。
vec_el = np.pi / 2.2
vec_az = np.pi / 4
dx = np.cos(vec_el) * np.cos(vec_az)
dy = np.cos(vec_el) * np.sin(vec_az)
dz = np.sin(vec_el)
完整:
from PIL import Image
import numpy as np
a = np.asarray(Image.open('D:\CSDN\手绘\光源.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)
dy = np.cos(vec_el) * np.sin(vec_az)
dz = np.sin(vec_el)
b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)
#为避免数据越界,将生成的灰度值裁剪至0‐255区间
b = b.clip(0, 255)
im = Image.fromarray(b.astype('uint8'))
im.save('D:\CSDN\手绘\shouhui.jpg')
结果