本文是图像处理101 教程系列的一部分。
图像处理和计算机视觉是计算机科学的热点趋势,由于其广泛的应用和乐观的发展前景,将继续呈现强劲的发展势头。在本教程系列的第一篇文章中,我们将了解图像是什么、它们如何存储,并解释图像处理的基础知识。
数字图像可以在计算机上显示和处理,根据其特点可以分为两大类:位图和矢量图像。
位图基于像素模式,通常由数字数组表示。 BMP、PNG、JPG 和GIF 都是位图。
矢量图像可以无限缩放并且没有像素,因为它们使用数学公式来绘制直线和曲线。大小为MN 的位图图像由MN 有限元组成。每个元素都有特定的位置和幅度,并表示有关该位置的信息,例如灰度或颜色。这些元素称为图像元素或像素。
色彩空间
根据每个像素所代表的信息,图像可以分为二值图像、灰度图像、RGB图像、索引图像等。
1. 二值图像
在二值图像中,像素值用0或1表示。通常0 表示黑色,1 表示白色。
2. 灰度图像
灰度图像在二值图像中添加白色和黑色之间的颜色深度,形成灰度图像。这些图像通常显示为从最暗的黑色到最亮的白色的灰色阴影,每种颜色的深度称为灰度,通常用L 表示。在灰度图像中,像素可以具有从0到L-1的整数值。
3.RGB图像
RGB 或彩色图像需要一组数字来表示每个像素的信息。因此需要一个三维矩阵来表示图像。自然界中几乎所有的颜色都是由红(R)、绿(G)、蓝(B)三种颜色组成的。因此,RGB图像中的每个像素都可以用红/绿/蓝阵列来表示。
4. 索引图像
索引图像由颜色图矩阵组成,该矩阵将数组中的像素值直接映射到颜色图值。使用相应的值确定图像中每个像素的颜色。下面将更详细地讨论这个问题。
图像如何存储在内存中
x86 硬件没有用于访问多维数组元素的寻址模式。当图像加载到存储中时,多维对象将转换为一维数组。通常,使用行优先或列优先排序。
行主要排序
C/C++ 和Python 使用行优先排序。它从第一行开始,然后连接到第二行及其末尾,然后连接到第三行。这意味着在行优先布局中,最后一个索引变化最快。对于矩阵,最后一个索引是列。
对于灰度图像,可以使用矩阵来表示每个像素的灰度级。以4*4图像为例。
内存
对于彩色图像,需要多维数组来存储图像信息。
列主要排序
在多维数组的行优先布局中,第一个索引变化最快。这是一个例子。
图像A 有6 个像素。
使用行优先排序,连续的内存地址分配如下:
当使用列优先排序时,连续的内存地址分配如下:
图像如何存储在文件中
真彩色(24 位)
24 位图像通常使用8 位表示R、G 和B。与灰度类似,对于三基色中的每一种,L 电平可用于指示存在多少该颜色分量。例如,对于256 级红色,0 表示无红色,255 表示100% 红色。同样,绿色和蓝色也可以分为256个级别。每种原色可以用8 位二进制数据表示,因此三种原色总共需要24 位。
未压缩的原始BMP 文件是使用RGB 标准存储的RGB 图像。
索引颜色
对于高度和宽度为200 像素、16 种颜色的彩色图像,每个像素由三个分量表示:RGB。因此,每个像素用3个字节表示,整个图像为2002003=120KB。由于彩色图像只有16种颜色,因此可以使用颜色表(16×3的二维数组)来存储这16种颜色的RGB值。下面对此进行更详细的解释。数组中的每个元素代表一种颜色,并按其在数组中的位置进行索引。图像像素不包含其颜色的完整规范,仅包含表中的索引。例如,如果颜色表中的第三个元素是0xAA1111,则所有颜色为0xAA1111的像素都可以用“2”表示(颜色表索引下标从0开始)。这种方法每个像素只需要4位(0.5字节),因此整个图像可以存储2002000.5=20 KB。上面的颜色表就是调色板,也称为查找表(LUT)。
GIF 是最流行的图像文件格式,支持索引颜色模式。
还有很多其他的图像格式和存储方式,这里不再赘述。下次我会介绍色彩模型相关的内容。
敬请期待~
版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。