前言
本文旨在为初学者提供有关计算机图像编码的基础知识,以帮助他们初步理解计算机中图像编码的概念。鉴于我个人知识的限制,如有不准确之处,欢迎指正并提供建议。
文中部分内容参考ChatGPT,在此感谢ppword的支持。
一、认识图片
我们先来看一张图片:
如果我们把它用ps打开,再放大后你可以看到如下信息:
从上面的图中,我们可以看到图片好像是由很多个小方块组成的,每个方块都有一个自己的颜色,这个颜色是单一的。图片的宽是60个小方块,图片的高是50个小方块,整个图片有60*50=3000个小方块组成。
1、像素
图片的像素是指图像的最小单位,通常以像素(pixel)来表示。每个像素都是图像中的一个小方块,它们排列在一个二维网格中,以创建完整的图像。
- 像素密度(通常以每英寸像素数表示,像素/英寸或PPI)也是一个重要概念,它表示在一英寸内有多少像素。
- 像素大小:像素的大小通常以微米(microns)为单位,表示一个像素的实际物理尺寸。
2、分辨率
图片分辨率是指图像中包含的像素数量,通常以水平像素数和垂直像素数表示。分辨率决定了图像的清晰度和细节水平。
以下是有关图片分辨率的详细介绍:
-
水平像素数和垂直像素数:分辨率通常由两个数字表示,分别代表图像的水平像素数和垂直像素数。例如,一张图像的分辨率可以是1920x1080,其中1920代表水平像素数,1080代表垂直像素数。
-
总像素数:要计算图像的总像素数,只需将水平像素数与垂直像素数相乘。例如,一张1920x1080的图像包含了共2073600个像素。
-
单位:通常,分辨率的单位是像素,但在某些情况下,也可以用其他单位,例如磅(常用于打印品质图像的分辨率),或PPI(每英寸像素数,用于描述图像在打印或显示设备上的输出质量)。
-
影响图像质量:图像的分辨率直接影响其质量。较高分辨率的图像通常更清晰,包含更多细节,因此适用于大型打印或高分辨率显示屏。较低分辨率的图像可能会在这些情况下显得模糊或失真。
-
文件大小:图像的分辨率也会影响其文件大小。通常情况下,较高分辨率的图像会占用更多的存储空间,因为它们包含更多的像素数据。这需要考虑,特别是在网络上传和下载图像或在设备上存储图像时。
3、像素的颜色
现在我们是不是只要把图片中的每个像素,用0和1的组合来表示,就可以在计算机中存储了呢,那我们要怎么来表示呢?
- 我们用1bit来表示一个像素,那可以表示2种颜色,这种图像叫,黑白图像(也称为二值图像),如下图:
- 用2bit来表示一个像素,那可以表示4种颜色
- 用3bit来表示一个像素,那可以表示8种颜色
- 用4bit来表示一个像素,那可以表示16种颜色
- 用5bit来表示一个像素,那可以表示32种颜色
- 用6bit来表示一个像素,那可以表示64种颜色
- 用8bit来表示一个像素,那可以表示256种颜色
- 用24bit来表示一个像素,那可以表示1677万种颜色
现在我们已经知道了,可以怎么样来表示图片像素的颜色,那现实生活中这么多种颜色,又怎么和这些数字对应上呢?解决这个问题之前,我们先来了解一下什么叫"图片的位深度"。
4、图片的位深度
图片的位深度,也称为色深或像素深度,它是指每个像素在图像中用多少位来表示其颜色或灰度级别。位深度决定了图像能够表示多少不同的颜色或灰度级别,以及图像的颜色精度。
常见的位深度包括:
-
1位位深度:每个像素只有两个可能的值,通常表示为0和1,用于二值图像,如黑白图像或透明/不透明图像。
-
8位位深度:每个像素可以有256个不同的颜色或灰度级别,通常用于灰度图像或基本的彩色图像。
-
24位位深度:通常用于真彩色图像,其中每个像素可以表示约1677万种不同的颜色。这是通过8位红色、8位绿色和8位蓝色通道组合而成的。
-
32位位深度:在真彩色图像的基础上,还可以包括一个8位的alpha通道,用于表示像素的不透明度。这通常用于图像合成和处理,如PNG图像格式。
位深度的增加会增加图像的颜色精度,使其能够表示更多的颜色或灰度级别。然而,更高的位深度也会导致图像文件变得更大,需要更多的存储空间。选择位深度通常要根据具体应用和需求来权衡。
接下来,我们再来看颜色所对应的值都可以怎么来确定。
二、RGB色彩空间
RGB颜色空间是一种用于表示彩色图像的常见颜色模型。RGB代表红色(Red)、绿色(Green)和蓝色(Blue),这三种颜色通道是通过不同的亮度值的组合来创建各种颜色的。在RGB颜色空间中,每个像素由三个分量组成,分别代表了红色、绿色和蓝色通道的亮度值。通过调整这三个通道的亮度值,可以混合出各种颜色。
1、发现
-
基本颜色:早期的颜色研究表明,人眼对三种颜色最敏感,这些颜色是红色、绿色和蓝色。这一发现奠定了三元色模型的基础。
-
James Clerk Maxwell:19世纪的苏格兰物理学家詹姆斯·克拉克·麦克斯韦对颜色混合进行了深入的研究。他通过将红色、绿色和蓝色光进行不同比例的混合,实验证明了颜色混合的原理,从而提出了三元色模型的概念。
2、常用数字表示方法
我们现在只要把R、G、B的亮度值,用数字的方式表示出来,如:
- 用3bit表示一个像素:红色、绿色、蓝色各占1位,8种颜色,用于大部分早期的电脑显示器
- 用8bit表示一个像素:红色占3位、绿色占3位、蓝色占2位,256种颜色,用于最早期的彩色Unix工作站
- 用16bit表示一个像素:红色占5位、蓝色占5位、绿色占6位,就是:RGB556或RGB16
- 用24bit表示一个像素,也被称为是:真彩色(True Color),就是:RGB24
- 用32bit表示一个像素:基于24位,增加8个位的透明通道,就是RGB32
3、颜色的表示方法
计算机中表示RGB颜色的方法主要有两种:整数表示和浮点数表示。这些方法是为了以数字形式存储和处理颜色信息而设计的,通常使用固定位数的通道值来表示红色(R)、绿色(G)、蓝色(B)颜色分量。
- 整数表示:这是最常见的RGB颜色表示方法之一,其中每个颜色通道的值表示为整数。通常,每个通道的值在0到255之间,因为8位二进制数可以表示256种不同的值。这被称为8位RGB表示。例如,(255, 0, 0)表示纯红色,(0, 255, 0)表示纯绿色,(0, 0, 255)表示纯蓝色。
对于R通道,取值0表示没有红光,取值255表示最大强度的红光。如果想表示更高的颜色精度,那只要把各通道的光的强度划分的更细就可以表示出来了。
- 浮点数表示:在某些应用中,需要更高的颜色精度,因此使用浮点数来表示RGB颜色。通常,每个通道的值在0.0到1.0之间,表示相对的亮度。这种表示在图像处理和计算机图形中常用,因为它允许更精确的颜色操作。例如,(1.0, 0.0, 0.0)表示纯红色,(0.0, 1.0, 0.0)表示纯绿色,(0.0, 0.0, 1.0)表示纯蓝色。
这两种表示方法都是为了在计算机中处理颜色而设计的,可以根据特定应用的需求选择使用整数表示还是浮点数表示。整数表示通常更常见,因为它们占用较少的存储空间,而浮点数表示提供更高的精度,适用于需要更高颜色精度的任务。
4、常见颜色的RGB
常见的24bit颜色:
- 红色:rgb(255, 0, 0),0xFF0000
- 绿色:rgb(0, 255, 0),0x00FF00
- 蓝色:rgb(0, 0, 255),0x0000FF
- 黄色:rgb(255, 255, 0),0xFFFF00
- 洋红色:rgb(255, 0, 255),0xFF00FF
- 青色:rgb(0, 255, 255),0x00FFFF
- 白色:rgb(255, 255, 255),0xFFFFFF
- 黑色:rgb(0, 0, 0),0x000000
- 更多颜色,可以参考颜色对照表,红绿蓝的比例不同,合成的颜色也就不同
从上面能看出,对于每个像素的值,在内存中是按RGB的顺序排放的,但有些地方有会出现BGR的顺序,使用过OpenCV的同学估计知道。
5、总结
尽管RGB颜色空间可以表示大多数可见颜色,但它并不是唯一的颜色模型。其他颜色模型,如CMYK、HSV、YUV等,也具有各自的优势,适用于不同的应用领域。选择颜色模型通常根据具体的需求和颜色表示方式来确定。
三、HSV色彩空间
HSV(Hue, Saturation, Value)是一种常见的颜色模型,用于描述和表示颜色。它强调颜色的感知属性,如色相(Hue)、饱和度(Saturation)、亮度(Value),并因此在图像处理、图形设计和艺术创作中得到广泛应用。
1、详细介绍:
-
色相(Hue):色相表示颜色的基本属性,即颜色的类型或种类。它通常以角度度量,范围是0°到360°,将颜色圆形连续分布在整个色相环上。在色相环中,红色位于0°或360°,绿色位于120°,蓝色位于240°,依此类推。通过调整色相,可以选择不同类型的颜色。
-
饱和度(Saturation):饱和度表示颜色的纯度或鲜艳度。它是从0%(无饱和度,对应于灰度)到100%(最大饱和度)的百分比。较高的饱和度表示颜色更鲜艳,而较低的饱和度会导致颜色变得更加灰淡。通过调整饱和度,可以使颜色更加鲜艳或更加淡化。
-
亮度(Value):亮度表示颜色的明亮度或亮度级别。它通常以百分比表示,范围从0%(黑色)到100%(白色)。较高的亮度值表示颜色更明亮,而较低的亮度值表示颜色更暗。通过调整亮度,可以改变颜色的明亮程度。
2、表示方法
HSV与RGB两种颜色模式都可以用来表示同一种颜色,但是,计算机显示器和许多其他设备都是基于RGB颜色模式工作的,因此在最终存储和显示时,通常会将HSV颜色模式转换为RGB颜色模式。
HSV到RGB的转换过程涉及一些数学计算,根据H(色相)在色轮上的位置,S(饱和度)和V(明度)的值,可以计算出对应的R、G、B值。
这种转换通常都由图形处理软件和编程语言库自动进行,使用者通常不需要直接进行这种转换。
YUV,是一种颜色编码方法。常使用在各个影像处理组件中。 YUV在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。这样就能为我们节省不少带宽,我们下次重点讨论一下。