32.3 表示图像

通常,Octave 支持四种不同类型的图像:灰度图像、RGB 图像、二值图像和索引图像。灰度图像用 M×N 矩阵表示,其中每个元素对应一个像素的强度。RGB 图像用 M×N×3 数组表示,其中每个三维向量对应每个像素的红色、绿色和蓝色强度。

灰度或 RGB 图像中像素值的实际含义取决于矩阵的类别。如果矩阵属于 double 类,像素强度介于 0 和 1 之间;如果属于 uint8 类,强度介于 0 和 255 之间;如果属于 uint16 类,强度介于 0 和 65535 之间。

二值图像是 logical 类的 M×N 矩阵。二值图像中的像素如果为 false 则为黑色,如果为 true 则为白色。

索引图像由一个 M×N 整数矩阵和一个 C×3 的颜色图组成。每个整数对应颜色图中的一个索引,颜色图中的每一行对应一种 RGB 颜色。颜色图必须是 double 类,其值介于 0 和 1 之间。

以下便捷函数可用于图像格式之间的转换。

 
dimg = im2double (img)
dimg = im2double (img, "indexed")

将图像转换为双精度(double)格式。

img 转换为双精度的方法取决于输入图像的类型。支持以下输入类别:

uint8, uint16, and int16

该类中的值范围被缩放到区间 [0, 1]。

logical

true 和 false 值分别被赋值为 1 和 0。

single

值被强制转换为 double 类型。

double

返回相同的图像。

如果 img 是索引图像,则第二个参数应为字符串 "indexed"。在这种情况下,img 必须是浮点类或无符号整数类,并且将被直接强制转换为 double 类型。如果是整数类,则会应用 +1 的偏移量。

另请参阅: double

 
img = gray2ind (I)
img = gray2ind (I, n)
img = gray2ind (BW)
img = gray2ind (BW, n)
[img, map] = gray2ind (…)

将灰度或二值强度图像转换为索引图像。

索引图像将包含 n 个不同的强度值。如果未指定 n,则灰度图像默认为 64,黑白二值图像默认为 2。

如果 n 小于或等于 256,则输出 img 为 uint8 类;否则返回类型为 uint16。

另请参阅: ind2grayrgb2ind

 
I = ind2gray (x, map)

将彩色索引图像转换为灰度强度图像。

图像 x 必须是索引图像,将使用颜色图 map 进行转换。x 中超出颜色图范围的像素会被裁剪map 的范围内。

输出 I 与输入 x 属于相同类别,可以是 uint8uint16singledouble 之一。

编程说明:有多种方法可以将颜色转换为灰度强度。此函数使用从 rgb2gray 获得的亮度值,即 I = 0.299*R + 0.587*G + 0.114*B。其他可能的方法包括使用 rgb2hsv 中的值分量,或使用 ind2rgb 的单个颜色通道。

x 中超出 map 颜色数量的索引值会被裁剪到 map 的范围内。例如,负索引被裁剪为第一种颜色,而较大的值(包括 NaNInf 等特殊值)被裁剪为最后一种颜色。

另请参阅: gray2indind2rgb

 
[x, map] = rgb2ind (rgb)
[x, map] = rgb2ind (R, G, B)

将红绿蓝(RGB)色彩空间中的图像转换为索引图像。

输入图像 rgb 可以指定为单个 M×N×3 矩阵,也可以指定为三个单独的变量 RGB(即三个颜色通道:红、绿、蓝)。

它输出一个索引图像 x 和一个颜色图 map,用于以与输入完全相同的方式解释图像。不执行抖动或其他形式的颜色量化。索引图像 x 的输出类别可以是 uint8、uint16 或 double,具体取决于表示图像中唯一颜色数量所需的精度(该数量将等于 map 的行数)。

还支持多维索引图像(大小为 M×N×3×K),可以通过单个输入(rgb)或三个颜色通道作为单独变量传入。

另请参阅: ind2rgbrgb2hsvrgb2gray

 
rgb = ind2rgb (x, map)
[R, G, B] = ind2rgb (x, map)

将索引图像转换为红色、绿色和蓝色分量。

图像 x 必须是索引图像,将使用颜色图 map 进行转换。x 中超出颜色图范围的像素会被裁剪map 的范围内。

也支持多维索引图像(大小为 M×N×1×K)。

输出可以是单个 RGB 图像(M×N×3 矩阵,其中 M 和 N 是原始图像 x 的尺寸,分别对应红色、绿色和蓝色通道)。或者,可以返回大小为 M×N 的三个单独的红色、绿色和蓝色矩阵。

编程说明:x 中超出 map 颜色数量的索引值会被裁剪到 map 的范围内。例如,负索引被裁剪为第一种颜色,而较大的值(包括 NaNInf 等特殊值)被裁剪为最后一种颜色。

另请参阅: rgb2indind2grayhsv2rgb

以下函数用于处理现有图像。

 
X = dither (RGB, map)
X = dither (RGB, map, Qm, Qe)
BW = dither (I)

使用抖动对图像进行量化,以增加表观色彩分辨率。

X = dither (RGB,map) 创建一个索引图像近似。它使用颜色图中提供的颜色,并应用抖动来增加表观色彩分辨率。Floyd-Steinberg 误差滤波器为:

     x    7/16
3/16 5/16 1/16

它使用光栅扫描,并且在边界处不进行权重重规范化。默认值为:Qm=5 和 Qe=8。

RGB 是一个 M×N×3 数组,其值在 [0, 1](double)或 [0, 255](uint8)范围内。

map 是一个 C×3 矩阵,包含 [0, 1](double)范围内的 RGB 三元组。

Qm 是反向颜色图每轴的量化位数(默认值:5)。

Qe 是误差扩散的量化位数(默认值:8,最大值:16)。

X 是所提供的颜色图 map 的一个 M×N 索引图像(如果 c ≤ 256 则为 uint8,否则为 uint16)。

Qm 是反向颜色图每个颜色轴上的量化位数。Qm 决定了该网格沿每个颜色轴(R、G、B)的分辨率。Qm 定义了用于将输入 RGB 值映射到颜色图中可用颜色的颜色空间离散化精度。Qe 是 Floyd-Steinberg 误差扩散算法中颜色空间误差计算的量化位数。它控制在抖动过程中计算和传播的误差值的精度。如果 Qe < Qm,误差扩散过程可能会损失精度。因此无法执行抖动,函数将返回一个未抖动的索引图像。

BW = dither (I) 将灰度输入图像 I 转换为二值图像,并在过程中应用抖动。输出图像 BW 是一幅黑白图像,通过抖动产生灰度 shades 的错觉。

参考资料:

  • R. W. Floyd and L. Steinberg,"An Adaptive Algorithm for Spatial Gray Scale",International Symposium Digest of Technical Papers,Society for Information Displays,p. 36,1975。
  • R. Ulichney,Digital Halftoning,The MIT Press,1987。

另请参阅: rgb2indgray2ind

Octave 还提供了用于创建和播放电影帧结构体的工具。这些结构体包含图像数据("cdata" 字段)以及相应的颜色图("colormap" 字段)。

 
frame = getframe ()
frame = getframe (hax)
frame = getframe (hfig)
frame = getframe (…, rect)

将图形或坐标轴捕获为电影帧结构体。

在没有参数的情况下,捕获当前坐标轴,不包括刻度标签、标题和 x/y/z 轴标签。返回的结构体 frame 包含一个字段 cdata,其中包含物理显示器中像素的实际图像数据(以 N×M×3(RGB)uint8 矩阵形式),以及字段 colormap(为与 MATLAB 兼容而提供,但始终为空)。

如果第一个参数 hax 是坐标轴句柄,则捕获该坐标轴,而不是从 gca 返回的当前坐标轴。

如果第一个参数 hfig 是图形句柄,则捕获相应的整个图形画布。

最后,如果提供了第二个参数 rect,则它必须是一个四个元素的向量([左 下 宽度 高度]),用于定义要捕获的图形内部区域。无论图形的 "units" 属性如何,rect 都必须在像素单位中定义。

另请参阅: im2frameframe2immovie

 
movie (mov)
movie (mov, n)
movie (mov, n, fps)
movie (h, …)

播放由帧结构体数组定义的电影。

电影 mov 必须是一个结构体数组,其中每个帧包含 "cdata""colormap" 字段,由 getframe 函数返回。默认情况下,所有图像在当前坐标轴上以每秒 12 帧的速度显示一次。

可选参数 n 是一个标量或整数向量,用于控制电影播放的次数以及要显示的特定帧:

第一个元素:
n(1) > 0

播放电影 n(1) 次。

n(1) < 0

播放电影 abs (n(1)) 次,交替按正向和反向顺序播放。

其他元素(如果有):

将显示 mov 中的帧索引。

如果第一个参数是图形或坐标轴的句柄 h,则在该图形或坐标轴中播放电影,而不是在当前坐标轴中播放。

另请参阅: getframeim2frameframe2im

 
[x, map] = frame2im (frame)

将电影帧转换为索引图像和 RGB 图像。

电影帧只是一个包含 "cdata""colormap" 字段的结构体。

frame 是一个结构体数组时,x 将分别是 M×N×1×K(索引电影)或 M×N×3×K(RGB 电影),每个帧连接在第四维度上。

另请参阅: im2framegetframe

 
frame = im2frame (rgb)
frame = im2frame (x, map)

将图像转换为电影帧。

电影帧只是一个包含 "cdata""colormap" 字段的结构体。

当每个图像投影(RGB 图像为 M×N 或 M×N×3 矩阵)连接到第四维度时,支持 N 维图像。在这种情况下,返回的值是一个结构体数组。

另请参阅: frame2im

colormap 函数用于更改当前坐标轴或图形的颜色图。

 
cmap = colormap ()
cmap = colormap (map)
cmap = colormap ("default")
cmap = colormap (map_name)
cmap = colormap (hax, …)
cmap = colormap (hfig, …)
colormap map_name

查询或设置当前颜色图。

在没有输入参数的情况下,colormap 返回当前的颜色图。如果当前没有图形窗口,则会先创建一个新的图形窗口,然后返回默认颜色图。

colormap (map) 将当前颜色图设置为 map。颜色图应该是一个 n 行 3 列的矩阵。各列分别包含红色、绿色和蓝色强度。所有分量必须介于 0 和 1 之间(包含端点)。返回新的颜色图。

colormap ("default") 恢复默认颜色图(包含 256 个分量的 viridis 颜色图)。返回默认颜色图。

颜色图也可以通过字符串 map_name 指定,该字符串是返回颜色图的函数的名称。

如果第一个参数 hax 是坐标轴句柄,则查询或设置该坐标轴的颜色图。如果第一个参数 hfig 是图形句柄,则设置或返回该图形对象的颜色图。

为方便起见,此函数也可以使用命令形式调用:colormap map_name

内置颜色图列表如下:

颜色图 描述
viridis 默认颜色图
turbo 遍历蓝色、青色、绿色、黄色、红色的颜色图;jet 的现代替代方案。
jet 遍历蓝色、青色、绿色、黄色、红色的颜色图。
cubehelix 遍历黑色、蓝色、绿色、红色、白色的颜色图,强度递增。
hsv 遍历色相、饱和度、明度(HSV)空间的循环颜色图。

另请参阅: rgbplotcmpermutecmunique

 
rgbplot = rgbplot (cmap)
rgbplot = rgbplot (cmap, k)

绘制颜色图分量的切片。

显示 cmap 沿第 k 个颜色分量的值。分量是 R(红色)、G(绿色)、B(蓝色),分别对应 1、2、3。默认值为 1。

另请参阅: colormap

 
[Y, newmap] = cmunique (X, map)
[Y, newmap] = cmunique (RGB)
[Y, newmap] = cmunique (I)

将输入图像 X 转换为输出索引图像 Y,使用尽可能小的颜色图 newmap

当输入是索引图像(X 带有颜色图 map)时,输出是一个颜色图 newmap,其中已消除所有重复的行。输出图像 Y 是原始输入图像,其索引已调整以匹配新的、可能更小的颜色图。

当输入是 RGB 图像(M×N×3 数组)时,输出颜色图将为原始图像中的每种唯一颜色包含一个条目。在最坏的情况下,新颜色图的行数可能与原始图像中的像素数一样多。

当输入是灰度图像 I 时,输出颜色图将为原始图像中的每个唯一强度值包含一个条目。在最坏的情况下,新颜色图的行数可能与原始图像中的像素数一样多。

实现细节:

newmap 始终是一个 M×3 矩阵,即使输入图像是强度灰度图像 I(所有三个 RGB 平面被赋予相同的值)。

如果新颜色图的大小小于或等于 256,则输出图像属于 uint8 类。否则,输出图像属于 double 类。

另请参阅: rgb2indgray2ind

 
[Y, newmap] = cmpermute (X, map)
[Y, newmap] = cmpermute (X, map, index)

重新排列颜色图中的颜色。

当仅用两个参数调用时,cmpermute 随机重新排列颜色图 map 并返回一个新的颜色图 newmap。它还返回索引图像 Y,这是在显示使用 newmap 时与原始输入图像 X 等效的图像。

当使用可选的第三个参数调用时,新颜色图中颜色的顺序由 index 定义。

注意: index 不应包含重复元素,否则函数将失败。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4