Numpy入门实例 图像的手绘效果 北理工嵩天老师python数据分析与展示 单元3随堂笔记
1.图像的数组表示
图像一般采用RGB色彩模式,即每个像素点的颜色由红(R),绿(G),蓝(B)组成。RGB三个颜色通道的变化和叠加得到各种颜色,其中:
R红色,取值范围,0-255.
G绿色,取值范围,0-255.
B蓝色,取值范围,0-255.
RGB形成的颜色包括了人类视力所能感知的所有颜色。
图像是一个由像素组成的二维矩阵,每个元素是一个RGB值。
PIL库 (pip install pillow)
PIL,Python Image Library
PIL库是一个具有强大图像处理能力的第三库。
from PIL import Image 引入图像库
Image是PIL库中代表一个图像的类(对象),一个Image对象就代表一个图像。
from PIL import Image
import numpy as np
im=np.array(Image.open('C:/Users/ASUS/Desktop/timg.jpg'))
print(im.shape,im.dtype)
(392, 500, 3) uint8
图象是一个三维数组,维度分别是高度、宽度和像素RGB值。在第三维的RGB值上它有三个维度。
图像的变换
读入图像,将读入的图像变成数组,形成像素RGB值的数组表示。修改后保存为新的文件就可改变图像。
b=[255,255,255]-im #计算图像的RGB通道的补值
im2=Image.fromarray(b.astype('uint8')) #将数组对象重新生成一个图像对象
im2.save('C:/Users/ASUS/Desktop/timg2.jpg')
图像变换的基本流程:首先打开图像;
对其中RGB对象做一个运算;
运算后的数组再生成一个图像类型;
保存为文件。
将彩色图片变为灰度图片
im=np.array(Image.open(‘C:/Users/ASUS/Desktop/timg.jpg’).convert(‘L’)
im=Image.fromarray(b.astype(‘uint8’))
im.save
图像的手绘效果实例分析
手绘效果的几个特征:
1.黑白灰色
2.边界线条较重
3.相同或相近色彩趋于白色
4.略有光源效果
图像的手绘效果代码:
from PIL import Image
import numpy as np
a=np.asarray(Image.open('C:/Users/ASUS/Desktop/timg.jpg').convert('L')).astype('float')
'''利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的远近程度'''
depth=10. #浮点数,预设深度值为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.) #构造x和y轴梯度的三维归一化单位坐标系
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('C:/Users/ASUS/Desktop/timg3.jpg') #生成图像