8 位和 16 位图像
索引图像
双精度(64 位)浮点数是数值数据默认的 MATLAB® 表现形式。但为了降低使用图像的内存需求,您可以分别使用数值类 uint8
和 uint16
将图像保存为 8 位和 16 位无符号整数。数据矩阵为 uint8
类的图像称为 8 位图像;数据矩阵为 uint16
类的图像称为 16 位图像。
image
函数可以显示 8 位或 16 位图像,而无需将其转换为双精度。但如果图像矩阵为 uint8
或 uint16
,则 image
在解释矩阵值时会稍微有些不同。具体的解释取决于图像类型。
如果 X
的类是 uint8
或 uint16
,那么在被用作颜色图索引之前,它的值会偏移 1。值 0 指向颜色图中的第一行,值 1 指向第二行,以此类推。image
命令自动提供合适的偏移,从而无论 X
是 double
、uint8
还是 uint16
,显示方法都一样:
image(X); colormap(map);
uint8
和 uint16
数据的颜色图索引偏移是用于支持标准图形文件格式的,这种文件通常以索引形式与包含 256 个颜色的颜色图一起存储。偏移可以让您使用更节约内存的 uint8
和 uint16
数组操作和显示这种形式的图像。
由于偏移,必须加 1 将 uint8
或 uint16
索引图像转换为 double
类。例如:
X64 = double(X8) + 1; or X64 = double(X16) + 1;
反过来,减 1 可将 double
索引图像转换为 uint8
或 uint16
类:
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 图像,无论它的类是 double
、uint8
,还是 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 函数中使用 uint8
和 uint16
数据,需要先将数据转换为 double
类型:
例如,如果 X
是一个 uint8
图像,那要将其数据转换为 double
类型便可使用以下语句:
fft(double(X))
在这种情况下,输出始终为 double
。
sum
函数返回与输入同一类型的结果,但它还提供了一个选项,可以使用双精度计算。
MATLAB 整数数学
有关数学函数如何使用非双精度数据类型的详细信息,请参阅 整数类的算术运算。
大多数 Image Processing Toolbox™ 函数都接受 uint8
和 uint16
输入。如果您打算对 uin
t8 或 uint16
数据进行复杂的图像处理,请考虑在 MATLAB 计算环境中包含该工具箱。
其他 8 位和 16 位数组支持
您可以对 uint8
和 uint16
数组执行其他几种操作,包括:
将 8 位 RGB 图像转换为灰度图像
您可以对整型数据执行数学运算,这样可以直接转换图像类型,而无需先转换图像数据的数值类。
此示例将一个 8 位 RGB 图像读入 MATLAB 变量,并将其转换为灰度图像:
rgb_img = imread('ngc6543a.jpg'); % Load the image image(rgb_img) % Display the RGB image axis image;
注意
该图像是在太空望远镜科学研究所(由大学天文研究联合组织管理)支持下根据 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;
相关信息
其他的颜色范围从深色到浅色连续变化的颜色图也可生成可用的图像。例如,使用 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 数组。 |