Main Content

8 位和 16 位图像

索引图像

双精度(64 位)浮点数是数值数据默认的 MATLAB® 表现形式。但为了降低使用图像的内存需求,您可以分别使用数值类 uint8uint16 将图像保存为 8 位和 16 位无符号整数。数据矩阵为 uint8 类的图像称为 8 位图像;数据矩阵为 uint16 类的图像称为 16 位图像。

image 函数可以显示 8 位或 16 位图像,而无需将其转换为双精度。但如果图像矩阵为 uint8uint16,则 image 在解释矩阵值时会稍微有些不同。具体的解释取决于图像类型。

如果 X 的类是 uint8uint16,那么在被用作颜色图索引之前,它的值会偏移 1。值 0 指向颜色图中的第一行,值 1 指向第二行,以此类推。image 命令自动提供合适的偏移,从而无论 Xdoubleuint8 还是 uint16,显示方法都一样:

image(X); colormap(map);

uint8uint16 数据的颜色图索引偏移是用于支持标准图形文件格式的,这种文件通常以索引形式与包含 256 个颜色的颜色图一起存储。偏移可以让您使用更节约内存的 uint8uint16 数组操作和显示这种形式的图像。

由于偏移,必须加 1 将 uint8uint16 索引图像转换为 double 类。例如:

X64 = double(X8) + 1;
	or
X64 = double(X16) + 1;

反过来,减 1 可将 double 索引图像转换为 uint8uint16 类:

X8 = uint8(X64 - 1);
	or
X16 = uint16(X64 - 1);

强度图像

double 图像数组范围通常是 [0, 1],而 8 位强度图像的范围通常是 [0, 255],16 位强度图像的范围通常是 [0, 65535]。使用如下命令以灰度颜色图显示 8 位强度图像:

imagesc(I,[0 255]); colormap(gray);

要将强度图像从 double 类转换为 uint16 类,首先乘以 65535:

I16 = uint16(round(I64*65535));

反过来,将 uint16 强度图像转换为 double 类之后,要除以 65535 :

I64 = double(I16)/65535;

RGB 图像

8 位 RGB 图像的颜色分量是 [0, 255] 范围内的整数值,而非 [0, 1] 范围内的浮点值。颜色分量为 (255,255,255) 的像素显示为白色。image 命令会正确显示 RGB 图像,无论它的类是 doubleuint8,还是 uint16

image(RGB);

要将 RGB 图像从 double 类转换为 uint8 类,首先乘以 255:

RGB8 = uint8(round(RGB64*255));

反过来,将 uint8 RGB 图像转换为 double 类之后,要除以 255:

RGB64 = double(RGB8)/255

要将 RGB 图像从 double 转换为 uint16,首先乘以 65535:

RGB16 = uint16(round(RGB64*65535));

反过来,将 uint16 RGB 图像转换为 double 类之后,要除以 65535:

RGB64 = double(RGB16)/65535;

uint8 和 uint16 的数学运算支持

要在以下 MATLAB 函数中使用 uint8uint16 数据,需要先将数据转换为 double 类型:

例如,如果 X 是一个 uint8 图像,那要将其数据转换为 double 类型便可使用以下语句:

fft(double(X))

在这种情况下,输出始终为 double

sum 函数返回与输入同一类型的结果,但它还提供了一个选项,可以使用双精度计算。

MATLAB 整数数学

有关数学函数如何使用非双精度数据类型的详细信息,请参阅 整数类的算术运算

大多数 Image Processing Toolbox™ 函数都接受 uint8uint16 输入。如果您打算对 uint8 或 uint16 数据进行复杂的图像处理,请考虑在 MATLAB 计算环境中包含该工具箱。

其他 8 位和 16 位数组支持

您可以对 uint8uint16 数组执行其他几种操作,包括:

  • 使用 reshapecatpermute 函数以及 []' 运算符重构、重新排序和串联数组

  • 使用 saveloaduint8uint16 数组保存及加载到 MAT 文件。(请记住,如果要加载或保存图形格式文件图像,则必须使用 imreadimwrite 命令代替。)

  • 使用 find 定位 uint8uint16 数组中非零元素的索引。但返回的数组始终为 double 类。

  • 关系运算符

将 8 位 RGB 图像转换为灰度图像

您可以对整型数据执行数学运算,这样可以直接转换图像类型,而无需先转换图像数据的数值类。

此示例将一个 8 位 RGB 图像读入 MATLAB 变量,并将其转换为灰度图像:

rgb_img = imread('ngc6543a.jpg'); % Load the image
image(rgb_img) % Display the RGB image

axis image;

Color image displayed in axes

注意

该图像是在太空望远镜科学研究所(由大学天文研究联合组织管理)支持下根据 NASA 合同 NAs5-26555 创建的,并得到 AURA/STScI 的复制许可。使用者可以免版权费获得由 AURA/ STScI 制作的图像的数字版本。感谢:J.P. Harrington 和 K.J. Orkowski(马里兰大学)以及 NASA。

基于 NTSC 标准合并 RGB 值,以此方式来计算单色亮度,这会将与眼睛敏感度相关的系数应用到 RGB 颜色:

I = .2989*rgb_img(:,:,1)...
	+.5870*rgb_img(:,:,2)...
	+.1140*rgb_img(:,:,3);

I 是具有整数值的强度图像,整数值范围从最小值零开始:

min(I(:))
ans =
	0

到最大值 255:

max(I(:))
ans = 
	255

要显示图像,请使用 256 值的灰度颜色图。这样可以避免调整数据到颜色的映射,当使用不同尺寸的颜色图时通常需要进行此项调整。如果颜色图未包含每个数据值的项,则需使用 imagesc 函数。

现在使用灰度颜色图在新图窗中显示图像:

figure; colormap(gray(256)); image(I);
axis image;

Color image displayed using a grayscale colormap appears gray

相关信息

其他的颜色范围从深色到浅色连续变化的颜色图也可生成可用的图像。例如,使用 colormap(summer(256)) 生成经典的示波器样式。有关更多选项,请参阅 colormap

brighten 函数可以让您增加或减少颜色图中的强度以补偿电脑显示差异或增强图像中模糊或明亮区域的可见性(其代价是另一端的颜色会有损失)。

图像类型和数值类摘要

下表总结了如何根据图像类型和数据类将数据矩阵元素解释为像素颜色。

图像类型

双精度数据

uint8 或 uint16 数据

索引

图像是由 [1, p] 范围内的整数组成的 m×n 数组。

颜色图是由 [0, 1] 范围内的浮点值组成的 p×3 数组。

图像是由 [0, p–1] 范围内的整数组成的 m×n 数组。

颜色图是由 [0, 1] 范围内的浮点值组成的 p×3 数组。

强度

图像是由经过线性调整以生成颜色图索引的浮点值组成的 m×n 数组。这些值通常的范围为 [0, 1]。

颜色图是由 [0, 1] 范围内的浮点值组成的 p×3 数组,通常为灰度颜色图。

图像是由经过线性调整以生成颜色图索引的整数组成的 m×n 数组。这些值的范围是 [0, 255] 或 [0, 65535]。

颜色图是由 [0, 1] 范围内的浮点值组成的 p×3 数组,通常为灰度颜色图。

RGB(真彩色)

图像是由 [0, 1] 范围内的浮点值组成的 m×n×3 数组。

图像是由 [0, 255] 或 [0, 65535] 范围内的整数组成的 m×n×3 数组。