图片是由非常多个点组成的,这个点被称为像素点.每一个像素点只有一种颜色,就像下图这样.
这要引入一个分辨率(DPI)的概念,DPI的单位是像素/英寸,意思是一英尺的长度里会有几个像素.
互联网中的图片一般是72dpi和96dpi,如果是海报或者摄影师需要冲印的照片需要300以上的dpi.
像素,尺寸和分辨率之间的关系
像素 = 尺寸 * 分辨率
例如,一张10cm20cm的图片,72dpi,换算成像素,这张图片就是720px1440px的.
图片的体积,是和图片的像素点个数与图片的位深度成正比的,当然也会和文件格式的压缩有关.
在windows中可以在图片右键属性-详细信息中查看图片的这些细节
图片是由很多像素组成的,每一个像素只有一种颜色,那么计算机是如何记录像素点的颜色的呢?
计算机中是由二进制记录数据的,记录像素点的色值当然也不例外,就像这样
010101101010111100101010
用多少位二进制来记录图片中像素的色值叫做图片的位深度
常见的位深度有:
另外,图片所表示的颜色种类还会受到图片的格式所限制.比如说gif格式的图片就只有256中颜色,
我们在互联网中常见的彩色图片通常都是24位的图片,又被称为真彩色,颜色数量已经超过了人眼能够分辨的颜色数量.
在24位图片中, 红、绿、蓝 ( RGB ) 三基色各以2的8次幂,也就是256种颜色而存在的,这也是为什么图片中三基色的色值都在0~255之间的原因了.
我们用python读取图片看看能得到什么样的数据
# coding=utf-8
import cv2
img = cv2.imread('finily.png')
print(img.shape)
print(img[:10])
这里要注意:不同的库读取出来的数据,三基色的排列顺序是不同的,matplotlib读到的数据是RGB格式的,而OpenCV读到的数据是BGR格式的.
这种格式未经压缩,可以理解成直接将图片色值的矩阵存到文件中了.
这种格式可以用来存储任何位深的图片.通用性非常广,包括透明图片.
互联网中常见的格式,该格式使用有损压缩来减少图片的大小,jpg文件不支持透明图片.
GIF只有256种颜色,图片质量相对JPG会大打折扣,但是GIF的优点是可以存储动图.
像素的颜色是由很多位二进制来记录的,比如真彩色图片是由24位二进制数记录颜色的.
但是我们对于每个二进制数所对应的颜色很难记忆,也不便于理解,所以就有了颜色空间的概念.
在RGB颜色空间中,我们认为所有的颜色都是由红、绿、蓝 ( RGB ) 三基色组成的.任何一种颜色都可以转换成这三种基本颜色的混合,只是各基色的比例不同而已.
所以在24位图片中,将这24位平分给红、绿、蓝三色,每种颜色各以2的8次幂,也就是256种颜色而存在的.所以在RGB颜色空间中每个像素的颜色由三个0~255的值决定,每个值代表一种基色.
CMYK和RGB很相似,只不过CMYK一般用于颜料和打印相关.因为颜料和光同样有三原色,光的三原色是红绿蓝,而颜料的三原色是红黄蓝.
HSV色彩空间中用三个参数来决定颜色:
HSL色彩空间中用色调,饱和度,亮度三个参数来决定颜色.其中的色调和HSV是同样的,只不过在饱和度和亮度方面的定义与HSV有些区别.
工作中经常使用如下几个库进行图片的读写操作.
>>> import imageio
>>> im = imageio.imread('cat.jpg')
>>> im.shape
(738, 1024, 3)
读取结果为图片像素矩阵,每个矩阵以RGB格式存储
>>> import matplotlib.pyplot as plt
>>> im = plt.imread('cat.jpg')
>>> im.shape
(738, 1024, 3)
matplotlib读取的结果和imageio是相同的
>>> import cv2
>>> im = cv2.imread('cat.jpg')
>>> im.shape
(738, 1024, 3)
注意:cv2读取出来的图片格式是BGR格式的,不是RGB格式的
默认情况cv2不会读取透明度,若想读取透明度可在第二个参数传cv2.IMREAD_UNCHANGED