像素、尺寸、分辨率

图片是由非常多个点组成的,这个点被称为像素点.每一个像素点只有一种颜色,就像下图这样.

有的时候同样是长宽10cm*10cm的图片,但是像素的个数却是不想同的,这是为什么呢?

这要引入一个分辨率(DPI)的概念,DPI的单位是像素/英寸,意思是一英尺的长度里会有几个像素.

互联网中的图片一般是72dpi和96dpi,如果是海报或者摄影师需要冲印的照片需要300以上的dpi.

像素,尺寸和分辨率之间的关系

像素 = 尺寸 * 分辨率

例如,一张10cm20cm的图片,72dpi,换算成像素,这张图片就是720px1440px的.

图片的体积,是和图片的像素点个数与图片的位深度成正比的,当然也会和文件格式的压缩有关.

在windows中可以在图片右键属性-详细信息中查看图片的这些细节

图片的位深度

图片是由很多像素组成的,每一个像素只有一种颜色,那么计算机是如何记录像素点的颜色的呢?

计算机中是由二进制记录数据的,记录像素点的色值当然也不例外,就像这样

010101101010111100101010

用多少位二进制来记录图片中像素的色值叫做图片的位深度

常见的位深度有:

  • 1位,也就是黑白照片,只有黑色和白色
  • 4位,有2的4次幂种颜色,16种颜色
  • 8位,2的8次幂表示,它含有256种颜色(VGA)
  • 24位,2的24次幂种颜色,16777216种颜色(真彩色, SVGA)
  • 32位,32位在24位基础上加了透明度,颜色数量和24位是一样的.

另外,图片所表示的颜色种类还会受到图片的格式所限制.比如说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])


可以从图片中看到,图片读到的是一个(720,1280,3)的矩阵
每一个像素由其中的一个小矩阵记录,其中的三个0~255的值分别代表三个基色的色值.

这里要注意:不同的库读取出来的数据,三基色的排列顺序是不同的,matplotlib读到的数据是RGB格式的,而OpenCV读到的数据是BGR格式的.

图片的常用文件格式

BMP

这种格式未经压缩,可以理解成直接将图片色值的矩阵存到文件中了.

PNG

这种格式可以用来存储任何位深的图片.通用性非常广,包括透明图片.

JPG

互联网中常见的格式,该格式使用有损压缩来减少图片的大小,jpg文件不支持透明图片.

GIF

GIF只有256种颜色,图片质量相对JPG会大打折扣,但是GIF的优点是可以存储动图.

常用颜色空间

像素的颜色是由很多位二进制来记录的,比如真彩色图片是由24位二进制数记录颜色的.

但是我们对于每个二进制数所对应的颜色很难记忆,也不便于理解,所以就有了颜色空间的概念.

RGB

在RGB颜色空间中,我们认为所有的颜色都是由红、绿、蓝 ( RGB ) 三基色组成的.任何一种颜色都可以转换成这三种基本颜色的混合,只是各基色的比例不同而已.

所以在24位图片中,将这24位平分给红、绿、蓝三色,每种颜色各以2的8次幂,也就是256种颜色而存在的.所以在RGB颜色空间中每个像素的颜色由三个0~255的值决定,每个值代表一种基色.

CMYK

CMYK和RGB很相似,只不过CMYK一般用于颜料和打印相关.因为颜料和光同样有三原色,光的三原色是红绿蓝,而颜料的三原色是红黄蓝.

HSV

HSV色彩空间中用三个参数来决定颜色:

  • 色调,颜色的类别,是属于红色那类的,还是黄色那类的
  • 饱和度,是指色彩的纯度,越高色彩越纯
  • 亮度
    是指色彩的纯度,越高色彩越纯
    因为HSV色彩空间只需要色调一个值就可以区分出来各种颜色,而排出亮度等因素的干扰,所以常用作图像识别和颜色过滤等领域.

HSL

HSL色彩空间中用色调,饱和度,亮度三个参数来决定颜色.其中的色调和HSV是同样的,只不过在饱和度和亮度方面的定义与HSV有些区别.

常用图片数据读取方法

工作中经常使用如下几个库进行图片的读写操作.

Imageio

>>> import imageio
>>> im = imageio.imread('cat.jpg')
>>> im.shape
(738, 1024, 3)

读取结果为图片像素矩阵,每个矩阵以RGB格式存储

matplotlib

>>> import matplotlib.pyplot as plt
>>> im = plt.imread('cat.jpg')
>>> im.shape
(738, 1024, 3)

matplotlib读取的结果和imageio是相同的

OpenCV

>>> import cv2
>>> im = cv2.imread('cat.jpg')
>>> im.shape
(738, 1024, 3)

注意:cv2读取出来的图片格式是BGR格式的,不是RGB格式的
默认情况cv2不会读取透明度,若想读取透明度可在第二个参数传cv2.IMREAD_UNCHANGED

posted @ 2018-06-01 16:55:09
评论加载中...

发表评论