在 MATLAB 中使用图像类型
MATLAB® 将图像表示为数组(通常是二维矩阵),其中每个元素对应所显示图像的一个像素。在 MATLAB 中处理图像类似于处理任何其他类型的矩阵数据,您可以在 MATLAB 中将任何二维数据显示为图像。显示图像有两种常见方式:
将数组数据显示为图像 - 使用
image
或imagesc
显示数组数据,该数组数据不一定表示一张图片,但可以包含可以可视化为图像的复杂图案。
图像类型
具有不同数组维度的三种常见图像类型是索引图像、灰度图像(强度图像)和 RGB 图像(真彩色图像)。下表摘要显示了这些图像类型。
图像类型 | 数据矩阵 | 颜色图矩阵 | 示例 |
---|---|---|---|
索引图像 | m×n | p×3 |
|
灰度(强度)图像 | m×n | 默认情况下没有,但您可以应用颜色图。 | |
RGB(真彩色)图像 | m×n×3 | 无 |
如果您正在处理图像文件,可以使用 imfinfo
函数检查图像类型。例如,确定 peppers.png
的图像类型。
info = imfinfo("peppers.png");
info.ColorType
ans = 'truecolor'
读取和显示图像文件
处理图像通常涉及将图像数据加载到 MATLAB 工作区中,显示图像以及处理图像数据。但是,处理图像的过程取决于图像类型。
索引图像
索引图像存储为图像数据矩阵 X
和颜色图矩阵 map
。map
的每一行指定单一颜色的红、绿和蓝分量。索引图像使用像素值到颜色图值的直接映射。每个图像像素的颜色通过使用 X
的对应值作为存储在颜色图中颜色值的索引(指针)来确定。X
是包含整数的 m×n 矩阵,其中值 1 指向 map
中第一行,值 2 指向第二行,依此类推。
例如,对于此玉米的索引图像,数据矩阵中的值 2 是颜色图第 2 行的索引,数据矩阵中的值 15 是颜色图第 15 行的索引。
读取和显示索引图像
使用 imread
加载索引图像,同时指定数据矩阵 X
和颜色图 map
作为输出参量。然后用颜色图显示数据矩阵。
[X,map] = imread("corn.png");
imshow(X,map)
map
存储与图像文件相关联的颜色图。不过,您可以使用 imshow
函数指定任何颜色图。例如,将 map
转换为灰度颜色图并使用新颜色图显示图像数据。
newmap = cmap2gray(map); imshow(X,newmap)
您可以使用矩阵下标从图像数据矩阵中选择单个像素。图像数据矩阵的大小对应于图像中的像素数。例如,X
表示由 415 行和 312 列像素组成的图像。
sz = size(X)
sz = 1×2
415 312
获取 X
的第 2 行第 15 列像素的颜色图索引。
val = X(2,15)
val = uint8
39
对 map
进行索引,并显示该像素的红色、绿色和蓝色强度的三个值。
color = map(val,:)
color = 1×3
0.4588 0.2902 0.2627
灰度(强度)图像
灰度图像有时也称为强度图像,它是一个存储为 m×n 的数据矩阵 X
,其中的值表示某一范围内的强度。灰度图像表示为单个矩阵,矩阵的每个元素对应一个图像像素。尽管灰度图像很少与颜色图一起保存,但它仍需要用灰度颜色图来显示。实际上,灰度图像被当做索引图像处理。
例如,对于玉米的此灰度图像,数据矩阵包含范围 [0, 255] 内的整数来表示每个像素的强度。
读取和显示灰度图像
将灰度图像加载到工作区中并显示该图像。
X = imread("corn_gray.png");
imshow(X)
您可以使用不同颜色图显示灰度图像。例如,通过使用 winter
颜色图以不同深浅的蓝色和绿色显示灰度图像。
imshow(X,winter)
您可以使用矩阵下标来访问图像的像素强度。例如,获取 X
的第 2 行第 15 列像素的灰度强度值。
val = X(2,15)
val = uint8
156
RGB(真彩色)图像
RGB 图像,有时称为真彩色图像,以 m×n×3 数据数组形式存储,该数组定义了对应图像每个像素的红色、绿色和蓝色分量。图形文件格式将 RGB 图像存储为 24 位图像,其中红色、绿色和蓝色分量各占 8 位。这样排列便可能产生 1600 万种颜色。这种可复制现实中图像的精度由此得名“真彩色图像”。
RGB 图像不使用颜色图。每个像素的颜色由存储在每个像素位置的颜色平面的红色、绿色和蓝色强度决定。例如,RGB 图像 X
中的像素 (10, 5) 的红色、绿色和蓝色分量分别存储在 X(10,5,1)
、X(10,5,2)
和 X(10,5,3)
中。
读取和显示 RGB 图像
加载 RGB 图像。由于 RGB 图像数据存储为一个 m
×n
×3 数组,其中每个像素由其红色、绿色和蓝色强度值表示,因此图像数据 X
包含颜色数据。然后显示图像。
X = imread("earth.jpg");
imshow(X)
您可以通过 RGB 图像的数据数组轻松访问图像大小和颜色。图像数据数组的大小对应于图像中的像素数。例如,X
表示由 257 行和 250 列像素组成的图像。
size(X)
ans = 1×3
257 250 3
要确定像素的颜色,请查看存储在数据数组的第三个维度中的 RGB 三元组。例如,获取 X
的第 50 行第 150 列的像素的颜色。这些元素分别表示像素颜色的红色、绿色和蓝色强度,范围为 0 到 255。
color = X(50,150,1:3)
color = 1x1x3 uint8 array
color(:,:,1) =
119
color(:,:,2) =
102
color(:,:,3) =
110
将数组数据显示为图像
使用数组数据可能涉及将其显示为图像以理解和分析复杂模式,例如数据值的相对强度。使用 image
和 imagesc
函数,您可以将工作区中任何二维矩阵的数据显示为图像,并对其应用颜色图。
例如,创建一个二维矩阵。然后,将其显示为图像。
X = 4*peaks(100); image(X)
为了更好地可视化数据值的差异,您可以通过使用 imagesc
函数并指定颜色图来自定义图像数据的显示方式。使用颜色栏显示图像,以查看图像数据如何映射到针对不同强度应用的颜色图。
imagesc(X); colormap(turbo) colorbar
将坐标区范围样式设置为 "equal"
,以便 MATLAB 保留图像的纵横比,并将像素显示为正方形。此外,设置坐标区范围。
axis equal
xlim([0 100])
ylim([0 100])