通常,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 转换为双精度的方法取决于输入图像的类型。支持以下输入类别:
该类中的值范围被缩放到区间 [0, 1]。
true 和 false 值分别被赋值为 1 和 0。
值被强制转换为 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。
I = ind2gray (x, map) ¶将彩色索引图像转换为灰度强度图像。
图像 x 必须是索引图像,将使用颜色图 map 进行转换。x 中超出颜色图范围的像素会被裁剪到 map 的范围内。
输出 I 与输入 x 属于相同类别,可以是 uint8、uint16、single 或 double 之一。
编程说明:有多种方法可以将颜色转换为灰度强度。此函数使用从 rgb2gray 获得的亮度值,即 I = 0.299*R + 0.587*G + 0.114*B。其他可能的方法包括使用 rgb2hsv 中的值分量,或使用 ind2rgb 的单个颜色通道。
x 中超出 map 颜色数量的索引值会被裁剪到 map 的范围内。例如,负索引被裁剪为第一种颜色,而较大的值(包括 NaN 和 Inf 等特殊值)被裁剪为最后一种颜色。
[x, map] = rgb2ind (rgb) ¶[x, map] = rgb2ind (R, G, B) ¶将红绿蓝(RGB)色彩空间中的图像转换为索引图像。
输入图像 rgb 可以指定为单个 M×N×3 矩阵,也可以指定为三个单独的变量 R、G 和 B(即三个颜色通道:红、绿、蓝)。
它输出一个索引图像 x 和一个颜色图 map,用于以与输入完全相同的方式解释图像。不执行抖动或其他形式的颜色量化。索引图像 x 的输出类别可以是 uint8、uint16 或 double,具体取决于表示图像中唯一颜色数量所需的精度(该数量将等于 map 的行数)。
还支持多维索引图像(大小为 M×N×3×K),可以通过单个输入(rgb)或三个颜色通道作为单独变量传入。
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 的范围内。例如,负索引被裁剪为第一种颜色,而较大的值(包括 NaN 和 Inf 等特殊值)被裁剪为最后一种颜色。
以下函数用于处理现有图像。
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 的错觉。
参考资料:
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 都必须在像素单位中定义。
(mov) ¶(mov, n) ¶(mov, n, fps) ¶(h, …) ¶播放由帧结构体数组定义的电影。
电影 mov 必须是一个结构体数组,其中每个帧包含 "cdata" 和 "colormap" 字段,由 getframe 函数返回。默认情况下,所有图像在当前坐标轴上以每秒 12 帧的速度显示一次。
可选参数 n 是一个标量或整数向量,用于控制电影播放的次数以及要显示的特定帧:
播放电影 n(1) 次。
播放电影 abs (n(1)) 次,交替按正向和反向顺序播放。
将显示 mov 中的帧索引。
如果第一个参数是图形或坐标轴的句柄 h,则在该图形或坐标轴中播放电影,而不是在当前坐标轴中播放。
[x, map] = frame2im (frame) ¶将电影帧转换为索引图像和 RGB 图像。
电影帧只是一个包含 "cdata" 和 "colormap" 字段的结构体。
当 frame 是一个结构体数组时,x 将分别是 M×N×1×K(索引电影)或 M×N×3×K(RGB 电影),每个帧连接在第四维度上。
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, …) ¶map_name ¶查询或设置当前颜色图。
在没有输入参数的情况下,colormap 返回当前的颜色图。如果当前没有图形窗口,则会先创建一个新的图形窗口,然后返回默认颜色图。
colormap (map) 将当前颜色图设置为 map。颜色图应该是一个 n 行 3 列的矩阵。各列分别包含红色、绿色和蓝色强度。所有分量必须介于 0 和 1 之间(包含端点)。返回新的颜色图。
colormap ( 恢复默认颜色图(包含 256 个分量的 "default")viridis 颜色图)。返回默认颜色图。
颜色图也可以通过字符串 map_name 指定,该字符串是返回颜色图的函数的名称。
如果第一个参数 hax 是坐标轴句柄,则查询或设置该坐标轴的颜色图。如果第一个参数 hfig 是图形句柄,则设置或返回该图形对象的颜色图。
为方便起见,此函数也可以使用命令形式调用:colormap map_name。
内置颜色图列表如下:
| 颜色图 | 描述 |
|---|---|
| viridis | 默认颜色图 |
| turbo | 遍历蓝色、青色、绿色、黄色、红色的颜色图;jet 的现代替代方案。 |
| jet | 遍历蓝色、青色、绿色、黄色、红色的颜色图。 |
| cubehelix | 遍历黑色、蓝色、绿色、红色、白色的颜色图,强度递增。 |
| hsv | 遍历色相、饱和度、明度(HSV)空间的循环颜色图。 |
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 类。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-4