处理nrrd文件的命令行工具

NRRD是什么

Nrrd 是一个用于表示和处理 N 维栅格数据的工具。它提供了一种有效且通用的方式来处理科学和医学图像和卷。Nrrd 促进了通常在可视化或分割(裁剪、量化、重采样)之前的预处理任务,以及有助于理解数据集结构的基本分析任务(直方图、最大强度投影、连接组件)。Nrrd 有一个持久的习惯,即替换人们经常为转换数据集而编写的一次性代码,同时还提供一种方便、灵活和可移植的文件格式来存储数据。

在内存和磁盘上,规则格上数据的扫描线排序强加了所有样本的严格线性排序。nrrd 的一个基本能力是管理栅格数据的多维逻辑结构与其一维物理布局之间的关系。这种数据有四个基本方面:网格的维度、样本的栅格顺序、关于每个轴的附加信息以及与每个样本点相关的数据类型。现在更详细地考虑这四个方面。

数据维度

Nrrd 旨在表示任何维度大于零的栅格数据。理想情况下,可表示维度没有运行时限制。当前的实现(nrrd 库)对维度设置了#define限制; NRRD_DIM_MAX当前设置为 16。维度的一个微妙方面涉及非标量数据的处理。nrrd 中的一个简化设计决策是“一切都是标量”。因此,为了表示向量的 3 维场,一个 4 使用一维 nrrd,通常将向量的 (X,Y,Z) 分量交错在样本点之间。在这种情况下,第一个轴有 3 个样本,而第二个、第三个和第四个轴对应于网格的空间维度。“一切都是标量”,因为向量场表示为 4-D 标量数组,而不是 3-D 向量数组。相反,对于标量 3-D 数据,空间维度由 3 维 nrrd 的第一、第二和第三轴表示。虽然对概念上相同的网格使用不同维度的 nrrds 似乎很奇怪,但经验表明,这并不是使用 nrrds 表示和操作标量、向量和张量数据的障碍,尤其是考虑到低- nrrd 函数 的级别风味。

具有完整的维度通用性使术语“维度”和“维度”复杂化。虽然“维度”(单数)可以严格用于指代网格本身的维度(1 表示直方图,2 表示灰度图像,3 表示彩色图像等),而“维度”(复数)可以指代网格本身的维度。沿轴的样本数量,这似乎有风险。在 nrrd 的上下文中,“维度”仅用于前一种含义(有多少维),而“大小”始终用于后一种含义(有多少样本)。另一种可能性是必须对这两个术语使用“维度”和“等级”。因此,以 nrrd 表示的 NTSC 彩色图像的尺寸为 3,尺寸为 3、640 和 480。

光栅顺序

轴的顺序是基本的。在 nrrd 中,每当轴按顺序表示或标识时,排序总是从“最快”到“最慢”。如果我们为每个轴分配坐标,并从第一个样本(所有零坐标)到最后一个样本遍历栅格数据的物理布局,那么最快的轴对应于在我们遍历样本时增加最快的坐标。因此,对于典型的交错彩色图像数据,nrrd 的轴排序是彩色、水平和垂直。

我们所说的这些轴是一个完全独立的约定问题:“X”可以指最快或最慢的空间维度。在 C/C++ 中创建多维数组的不同方案具有不同的关联轴排序。例如,通过val[x][y][z]索引数据 意味着 X 轴是最慢的。另一方面,如果sx和sy分别是 X 和 Y 轴的大小,那么通过 (val + x + sx(y + sy*z))索引数据 意味着 X 轴是最快的。Nrrd 对这些问题完全不可知论;它对轴名称或索引方法没有强加或暗示任何策略。轴在nrrd中标识 仅通过它们的积分索引进入轴排序。对于上面提到的颜色数据示例,颜色轴为 0,水平为 1,垂直为 2。

数据轴

nrrd 可以表示轴的许多方面。样本数量是唯一需要的信息。有一个动态分配的char*可用于为每个轴命名的字符串。样本之间的间距也被表示出来,如果在某个“世界”空间中轴的范围是已知的,那么轴的最小和最大位置也可以被表示出来。单变量直方图和联合直方图在它们的轴上自然有一个最小值和最大值;许多体积数据集只有间距的概念。还可以指示沿轴的样本是否以单元或节点为中心。这在表示直方图(必须以细胞为中心)和图像数据(如果您在谈论 mipmap 时可能以细胞为中心,但在许多其他信号处理上下文中以节点为中心)方面起着重要作用。

所有这些描述每个轴的外围信息都使用 nrrdSave()和nrrdWrite() 保存到 NRRD 文件中,并使用nrrdLoad ( )和nrrdRead()读入。此外,轴信息通过所有基本的 nrrd 操作跟随每个轴。例如,如果您有一个带有轴标签“x”、“y”和“z”的体积,并且您使用nrrdSlice()沿轴 0 切割体积,则生成的二维 nrrd 将具有轴标签“y ”和“z”。如果您使用nrrdSpatialResample()要将 640x480 以单元为中心的灰度图像(间距为 1.0 和 1.0)下采样为 256x256 图像,生成的间距将为 2.5 和 1.875(如果是以节点为中心,则为 2.50588 和 1.87843)。外围信息的正确和智能处理,例如单元格与节点中心和特定轴的样本间距,是“几乎原始”和“原始”栅格数据之间的核心区别。在 1998 年开始开发nrrd 的主要动机是缺乏灵活而强大的工具来操作具有完整维度通用性的几乎原始栅格数据。其余的teem 库都是从nrrd 发展而来的。

数据类型

Nrrd 可以处理十种不同类型的标量数据。有 8 种整数类型(1、2、4 和 8 字节整数,有符号和无符号)和两种浮点类型(4 字节浮点数,8 字节双精度数)。这些当前使用 C 类型“ char ”、“ short ”、“ int ”和“ long long ”(以“ signed ”或“ unsigned ”为前缀)以及“ float ”和“ double ”来实现。尽管“ long double ”在许多系统上都可用,但它没有标准大小(Mac OSX 上为 8 字节,Intel 上为 12 字节,其他地方为 16 字节),因此它不包含在 nrrd 中。

然而,谨慎而有原则的 C/C++ 程序员会很快指出,根据 C 语言的定义,不能指望任何类型具有特定的位大小。 我们所知道的是sizeof(char)为 1,但char不必是 8 位。只有 C99 语言提供有保证的类型的位长度表示。尽管如此,令人惊喜的是,nrrd 开发实际上还没有遇到上面列出的类型大小不支持的机器,或者一个字节不是 8 位的机器。因此,上面列出的 C 类型在 nrrd中很常见 在所有平台上实现:GNU/Linux、Solaris(32 和 64 位)和 Irix(32 和 64 位)、Mac OSX 和 Windows(对 8 字节整数有不同的名称)。一旦一个机器出现,具有不同底层类型大小的机器将为实现和测试迄今为止不需要的类型抽象系统提供机会和上下文。

有一种最终的 nrrd 类型,称为“块”。这实际上不是一个标量,而是一个指定长度的不透明内存块。这允许 nrrd 表示和操作,例如,大量 C 结构或 C++ 对象,只要它们的大小都相同。Nrrd 不能从一个块中确定一个标量值,也不能从标量值创建块,因此它不能对块数组进行直方图或过滤重采样等操作。但支持许多其他操作,例如切片、裁剪、轴置换和某些类型的填充。


命令行工具

https://www.cs.utah.edu/gdc/projects/urt/

image


        --- unu: Utah Nrrd Utilities command-line interface ---
     unu about ... Information about this program and its use
      unu make ... Create a nrrd (or nrrd header) from scratch
      unu head ... Print header of one or more nrrd files
      unu data ... Print data segment of a nrrd file
   unu convert ... Convert nrrd to another type (as if by per-value cast)
  unu resample ... Filtering and {up,down}sampling with a seperable kernel
   unu cmedian ... Cheap histogram-based median/mode filtering
    unu minmax ... Print out min and max values in one or more nrrds
  unu quantize ... Quantize values to 8, 16, or 32 bits
unu unquantize ... Recover floating point values from quantized data
   unu project ... Collapse scanlines to scalars along some axis
     unu slice ... Slice at a position along an axis
      unu dice ... Save all slices along one axis into separate files
    unu splice ... Replace a slice with a different nrrd
      unu join ... Connect slices and/or slabs into a bigger nrrd
      unu crop ... Crop along each axis to make a smaller nrrd
     unu inset ... Replace a sub-region with a different nrrd
       unu pad ... Pad along each axis to make a bigger nrrd
   unu reshape ... Superficially change dimension and/or axes sizes
   unu permute ... Permute scan-line ordering of axes
      unu swap ... Interchange scan-line ordering of two axes
   unu shuffle ... Permute slices along one axis
      unu flip ... Reverse order of slices along one axis
  unu unorient ... make image orientation be axis-aligned
    unu axinfo ... Modify attributes of an axis
  unu axinsert ... Add a "stub" (length 1) axis to a nrrd
   unu axsplit ... Split one axis into two axes
  unu axdelete ... Remove one or more singleton axes from a nrrd
   unu axmerge ... Merge two adjacent axes into one
      unu tile ... Tile slices of one axis into two other axes
    unu untile ... Undo "unu tile": merge slow parts of two axis splits
     unu histo ... Create 1-D histogram of values in a nrrd
    unu dhisto ... Create (PGM) image of 1-D value histogram
    unu jhisto ... Create joint histogram of two or more nrrds
    unu histax ... Replace each scanline along an axis with its histogram
       unu heq ... Perform histogram equalization
     unu gamma ... Brighten or darken values with a gamma
       unu 1op ... Unary operation on a nrrd
       unu 2op ... Binary operation on two nrrds, or on a nrrd and a constant
       unu 3op ... Ternary operation on three nrrds or constants
       unu lut ... Map nrrd through one univariate lookup table
      unu mlut ... Map nrrd through whole nrrd of univariate lookup tables
     unu subst ... Map nrrd through a univariate substitution table
      unu rmap ... Map nrrd through one *regular* univariate map ("colormap")
     unu mrmap ... Map nrrd through a whole nrrd of regular univariate maps
      unu imap ... Map nrrd through *irregular* univariate map ("colormap")
      unu lut2 ... Map nrrd through a bivariate lookup table
    unu ccfind ... Find connected components (CCs)
     unu ccadj ... Form adjecency matrix of connected components
   unu ccmerge ... Merge CCs with their neighbors, under various contraints
  unu ccsettle ... Remap CC values down to lowest contiguous values
      unu save ... Write nrrd with specific format, encoding, or endianness