图像的数组表示
图像的RGB色彩模式
图像一般使用RGB色彩模式,即每个像素点的颜色由红®、绿(G)、蓝(B)组成。
RGB三个颜色通道的变化和叠加得到各种颜色,其中
• R 红色,取值范围,0‐255
• G 绿色,取值范围,0‐255
• B 蓝色,取值范围,0‐255
RGB形成的颜色包括了人类视力所能感知的所有颜色。
图像是由一个像素组成的二维矩阵,每个元素是一个RGB值,且为三个字节,每个字节分别对应RGB中的一个。RGB值:(R,G,B)
PIL库(Python Image Library)
PIL库是一个具有强大图像处理能力的第三方库,
在命令行下的安装方法: pip install pillow
from PIL import Image
Image是PIL库中代表一个图像的类(对象)
In [1]: from PIL import Image
In [2]: import numpy as np
In [4]: im = np.array(Image.open("D:/MySource/日常乱七八糟/2020大数据课程.png"))
#此处利用open属性将图片打开,利用array将图片转化为数组
In [5]: print(im.shape,im.dtype)
(829, 2536, 4) uint8 #打印出图像的shape和dtype
# 图像是一个三维数组,维度分别是高度、宽度、像素RGB值。
# 有时候结果可能显示第三个维度的值为3,这里为4。下述解释:
# 色彩模式,如:当图像为RGB模式时,通道就会产生三个颜色通道和一个混合通道,
# 混合通道位于最上方,下面依次是红、绿、蓝通道,当把图像转为CMYK模式时,
# 通道总数就是五个,第一个是混合通道,下面依次是青、品、黄、黑四个通道,如果转为灰度模式,那么就只有一个通道了!
In [6]: im.shape
Out[6]: (829, 2536, 4)
In [7]: im.dtype
Out[7]: dtype('uint8')
图像的变换
读入图像后,获得像素RGB值,修改后保存为新的文件。
In [8]: from PIL import Image
In [9]: import numpy as np
In [10]: im_1 = np.array(Image.open("D:\MySource\日常乱七八糟\故宫.jfif"))
In [11]: im_1.shape
Out[11]: (2592, 3872, 3)
In [12]: im_1.dtype
Out[12]: dtype('uint8')
In [13]: b = [255,255,255] - im_1
In [15]: im_2 = Image.fromarray(b.astype('uint8'))
In [17]: im_2.save("D:\MySource\日常乱七八糟\故宫2.jfif")
In [19]: from PIL import Image
In [20]: import numpy as np
In [21]: a = np.array(Image.open("D:\MySource\日常乱七八糟\故宫.jfif").convert('L'))
#.convert():PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
#'L'为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
#转换公式:L = R * 299/1000 + G * 587/1000+ B * 114/1000。
In [22]: b = 255-a
In [23]: im = Image.fromarray(b.astype('uint8'))
In [24]: im.save("D:\MySource\日常乱七八糟\故宫3.jfif")
In [25]: from PIL import Image
In [26]: import numpy as np
In [27]: a = np.array(Image.open("D:\MySource\日常乱七八糟\故宫.jfif").convert('L'))
In [28]: d = 255 * (a/255) ** 2
In [30]: im = Image.fromarray(d.astype('uint8'))
In [31]: im.save("D:\MySource\日常乱七八糟\故宫4.jfif")
In [32]: from PIL import Image
In [33]: import numpy as np
In [34]: a = np.array(Image.open("D:\MySource\日常乱七八糟\故宫.jfif").convert('L'))
In [35]: c = (100/255)*a + 150 #区间变换
In [37]: im = Image.fromarray(c.astype('uint8'))
In [38]: im.save("D:\MySource\日常乱七八糟\故宫5.jfif")
图像的手绘效果
略。。。