OpenCV(1):计算机眼中的图像
型元素已经可以表示1600万种可能的颜色(使用RGB颜色空间),但若使用float(4字节,32位)或double(8字节,64位)则能给出更加精细的颜色分辨能力。很多情况下,因为内存足够大,可实现连续存储,因此,图像中的各行就能一行一行地连接起来,形成一个长行。无论哪种方法,我们(人类)看到的是图像,而让数字设备来“看“的时候,则是在记录图像中的每一个点的数值。若以一个字节来给颜色编码,则其值在
1 何为图像?
图像是人对视觉感知的物质再现。图像可以由光学设备获取,如照相机、镜子、望远镜及显微镜等;也可以人为创作,如手工绘画。图像可以记录、保存在纸质媒介、胶片等等对光信号敏感的介质上。
随着数字采集技术和信号处理理论的发展,越来越多的图像以数字形式存储。因而,有些情况下“图像”一词实际上是指数字图像。
2 计算机眼里的图像
从真实世界中获取数字图像有很多方法,比如数码相机、扫描仪、CT或者磁共振成像。无论哪种方法,我们(人类)看到的是图像,而让数字设备来“看“的时候,则是在记录图像中的每一个点的数值。
在计算机眼中,图像是以数字矩阵的形式存储的,一张图片被分成了若干个方格,但是方格还没有足够小,随意取出一个方格进行放大,还会有许多更小的方格,这个小到不能再小的方格叫做一个像素点,像素点有对应的值,在[0,255]之间,数值越大表示这个像素点越亮。如下图所示:

换言之,在计算机世界:
图像是就是像素点构成的三维矩阵(row,col,pixel)。
像素点的位置由三维矩阵中的row,col确定;如(0,0)代表位于第一行、第一列的像素点。
像素点的值由三维矩阵中的pixel确定;像素的值代表图像的亮度。
2.1 像素值
像素值的取值范围,与颜色空间、数据类型(又称图像深度)密切相关。
颜色空间
颜色空间是指对一个给定的颜色,如何组合颜色元素以对其编码。
灰度级空间(GRAY)
是最简单的颜色空间,只处理黑色和白色,对它们进行组合可以产生不同程度的灰色。
若以一个字节来给颜色编码,则其值在[0,255]之间,0代表黑色,255代表白色,0到255之间的数值代表不同的灰度。
彩色颜色空间
对于 彩色 方式则有更多种类的颜色空间,但不论哪种方式都是把颜色分成三个或者四个基元素,通过组合基元素可以产生所有的颜色。RGB颜色空间是最常用的一种颜色空间,这归功于它也是人眼内部构成颜色的方式。它的基色是红色、绿色和蓝色,有时为了表示透明颜色也会加入第四个元素 alpha (A)。
彩色有很多的颜色空间,各有自身优势:
- RGB是最常见的,这是因为人眼采用相似的工作机制,它也被显示设备所采用。
- HSV和HLS把颜色分解成色调、饱和度和亮度/明度。这是描述颜色更自然的方式,比如可以通过抛弃最后一个元素,使算法对输入图像的光照条件不敏感。
- YCrCb在JPEG图像格式中广泛使用。
- CIE L*a*b*是一种在感知上均匀的颜色空间,它适合用来度量两个颜色之间的 距离 。
数据类型(又称图像深度)
每个颜色空间都有其自己的定义域,取决于其数据类型(又称图像深度)。
数据类型(又称图像深度)决定了各个颜色空间的像素值的范围。
最小的数据类型是 char ,占一个字节或者8位,可以是有符号型(0到255之间)或无符号型(-127到+127之间)。
尽管使用三个 char 型元素已经可以表示1600万种可能的颜色(使用RGB颜色空间),但若使用float(4字节,32位)或double(8字节,64位)则能给出更加精细的颜色分辨能力。但同时也要切记增加元素的尺寸也会增加了图像所占的内存空间。如:
- 一张彩色的图片有R、G、B三个颜色通道,每个通道上的像素点的值代表该通道上的亮度。
- 一张灰度图(黑白图)只有一个颜色通道。
2.2 如何描述一张图像
描述一张图像的矩阵的维度可以表示为[h,w,c] ,其中:
- h 代表高度方向上的像素点数,
- w 代表宽度方向上的像素点数,
- c 代表通道数。
- 对于灰度图像,无c 这个维度;
- 对于RGB图像,c顺序为[r,g,b] ;
- 对于RGBA图像,c 顺序为[r,g,b,a] ;
图像转化为numpy类型后就是shape为 [h(高度),w(宽度),c(通道数)] 的矩阵,对于灰度图像,无c 这个维度。
若图像转化为numpy类型后,返回的数组有如下形状:
- (H, W):表示灰度图像。
- (H, W, 3):表示RGB图像。
- (H, W, 4):表示RGBA图像。
- PNG图像作为浮点数组(0-1)返回。所有其他格式都作为int数组返回,深度由文件的内容决定。
如何获取并存储这些像素值由我们的需求而定,最终在计算机世界里所有图像都可以简化为数值矩以及矩阵信息。
作为一个计算机视觉库, OpenCV 其主要目的就是通过处理和操作这些信息,来获取更高级的信息。因此,OpenCV如何存储并操作图像是你首先要学习的。
2.3 图像是如何存储在内存中的?
图像矩阵的大小取决于我们所用的颜色模型(颜色空间、数据类型),确切地说,取决于所用通道数。如果是灰度图像,矩阵就会像这样:

而对多通道图像来说,矩阵中的列包含多个子列,其子列个数与通道数相等。例如,RGB颜色模型的矩阵(请注意OpenCV中RGB图像的通道排列是BRG):

注意到,子列的通道顺序是反过来的:BGR而不是RGB。很多情况下,因为内存足够大,可实现连续存储,因此,图像中的各行就能一行一行地连接起来,形成一个长行。连续存储有助于提升图像扫描速度。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)