1、图像的RGB色彩模式
PIL
PIL, Python Image Library
PIL库是一个具有强大图像处理能力的第三方库
在命令行下的安装方法: pip install pillow
from PIL import Image
Image是PIL库中代表一个图像的类(对象)
from PIL import Image
import numpy as np
im=np.array(Image.open(r"C:\Users\Administrator\Desktop\timg.jpg"))
print(im.shape,im.dtype)
可以看出图像是一个三维数组,800行,1200列,每一个点分别是RGB三个值。
2、图像的变换
(1)
b=[255,255,255]-im
a=Image.fromarray(b.astype('uint8'))%生成新的图像三维数组
a.save(r"C:\Users\Administrator\Desktop\timg_2.jpg")
(2)
模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:
L = R * 299/1000 + G * 587/1000+ B * 114/1000
下面我们将图像转换为“L”图像。
a=np.array(Image.open(r"C:\Users\Administrator\Desktop\timg.jpg"))
b=np.array(Image.open(r"C:\Users\Administrator\Desktop\timg.jpg").convert('L'))
c=Image.fromarray(b.astype('uint8'))
c.save(r"C:\Users\Administrator\Desktop\timg_5.jpg")
RGB三个数变为了一个数。
(3)
a=np.array(Image.open(r"C:\Users\Administrator\Desktop\timg.jpg").convert('L'))%变为灰度值图片
a
Out[12]:
array([[104, 104, 104, ..., 145, 145, 145],
[104, 104, 104, ..., 145, 145, 145],
[104, 104, 104, ..., 145, 145, 145],
...,
[ 70, 78, 79, ..., 73, 65, 78],
[ 72, 79, 78, ..., 76, 49, 83],
[ 73, 71, 69, ..., 118, 76, 97]], dtype=uint8)
b=255-a
b
Out[14]:
array([[151, 151, 151, ..., 110, 110, 110],
[151, 151, 151, ..., 110, 110, 110],
[151, 151, 151, ..., 110, 110, 110],
...,
[185, 177, 176, ..., 182, 190, 177],
[183, 176, 177, ..., 179, 206, 172],
[182, 184, 186, ..., 137, 179, 158]], dtype=uint8)
im=Image.fromarray(b.astype('uint8'))
im.save(r"C:\Users\Administrator\Desktop\timg_3.jpg")
(4)
d=255*(a/255)**2 %平方变换
im=Image.fromarray(d.astype('uint8'))
im.save(r"C:\Users\Administrator\Desktop\timg_4.jpg")
(5)
d=(100/255)*a+150%区间变换
im=Image.fromarray(d.astype('uint8'))
im.save(r"C:\Users\Administrator\Desktop\timg_4.jpg")
2、图像手绘效果分析
手绘效果的几个特征:
• 黑白灰色
• 边界线条较重
• 相同或相近色彩趋于白色
• 略有光源效果
(1)梯度重构
利用像素之间的梯度值和虚拟深度值对图像进行重构
(2)光源效果
根据灰度变化来模拟人类视觉的远近程度
(3)
(4)
from PIL import Image
import numpy as np
a = np.asarray(Image.open(r"C:\Users\Administrator\Desktop\timg.jpg").convert('L')).astype('float')
depth = 10.
grad = np.gradient(a) #梯度值,
grad_x, grad_y = grad
grad_x = grad_x*depth/100. #列梯度值*0.1
grad_y = grad_y*depth/100.
A = np.sqrt(grad_x**2 + grad_y**2 + 1.) #相当于grad_z=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) #长度为1,投影x,y,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(r"C:\Users\Administrator\Desktop\timg_6.jpg")
数据变化过程如下
目的其实是将数据两级化,要么黑要么白,更好凸显手绘的感觉
x,y梯度变化越大,,则z的梯度比例越小,此时求出的变化后的灰度值越小,颜色越黑。
相反,则灰度值越大,越白,将黑白分明就显示出来了。