图像的RGB色彩模式:
图像一般使用RGB色彩模式,即每个像素点的颜色由红(R)、绿(G)、蓝(B)组成。
RGB三个颜色通道的变化和叠加得到各种颜色,其中
• R 红色,取值范围,0‐255
• G 绿色,取值范围,0‐255
• B 蓝色,取值范围,0‐255
RGB形成的颜色包括了人类视力所能感知的所有颜色。
PIL库:
PIL, Python Image Library
PIL库是一个具有强大图像处理能力的第三方库,在命令行下的安装方法: pip install pillow
from PIL import Image
Image是PIL库中代表一个图像的类(对象)。
图像是一个由像素组成的二维矩阵,每个元素是一个RGB值。
# 打开图像文件,图像文件是一个RGB值组成的矩阵
im =np.array(Image.open("beijing.jpg"));
# (669, 1012, 3)uint8
# 图像是一个三维数组,维度分别是高度、宽度和像素RGB值
print(im.shape,im.dtype);
图像变换:
读入图像后,获得像素RGB值,修改后保存为新的文件
# -*- coding: utf-8 -*-
import numpy as np
from PIL import Image
import os
# 设置路径为当前路径
path = os.path.dirname(__file__);
os.chdir(path);
# 打开图像文件,图像文件是一个RGB值组成的矩阵
im = np.array(Image.open("beijing.jpg"));
# (669, 1012, 3) uint8
# 图像是一个三维数组,维度分别是高度、宽度和像素RGB值
print(im.shape, im.dtype);
# 图像的变换
# 读入图像后,获得像素RGB值,修改后保存为新的文件
a = np.array(Image.open("fcity.jpg"));
# 像素值取反操作
b = [255, 255, 255] - a;
img1 = Image.fromarray(b.astype('uint8'));
img1.save("fcity1.jpg");
# convert('L')将图像的RGB值转化为一个灰度值
c = np.array(Image.open("fcity.jpg").convert('L'));
d = 255 - c;
img2 = Image.fromarray(d.astype('uint8'));
img2.save("fcity2.jpg");
# 区间变换
e = (100/255)*c + 150;
img3 = Image.fromarray(e.astype('uint8'));
img3.save("fcity3.jpg");
# 像素平方
f = 255*(c/255)**2;
img4 = Image.fromarray(f.astype('uint8'));
img4.save("fcity4.jpg");
图像手绘效果:
# -*- coding: utf-8 -*-
from PIL import Image
import numpy as np
import os
# 设置路径为当前路径
path = os.path.dirname(__file__);
os.chdir(path);
a = np.asarray(Image.open('beijing.jpg').convert('L')).astype('float')
# (0-100)
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.;
# 光源对x 轴的影响
dx = np.cos(vec_el)*np.cos(vec_az);
# 光源对y 轴的影响
dy = np.cos(vec_el)*np.sin(vec_az);
# 光源对z 轴的影响
dz = np.sin(vec_el);
# 光源归一化
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');
图片素材:
beijing.jpg
fcity.jpg