跳转到内容

MINC/教程/编程01

来自维基教科书,自由的教科书

MINC 版本的 Hello World。

[编辑 | 编辑源代码]

任何值得称道的编程语言入门都会从一个 Hello World 示例开始。当然,MINC 并不是它自己的编程语言,而是一个 C 库。因此,本教程将假设对 C 有一定的基本了解,并指导读者完成打开和读取 MINC 卷的操作,然后继续讨论更高级的主题,并在此过程中讨论 MINC 文件格式的一些特殊之处。

所有代码示例都将使用 MINC 库版本 2.x(在 2.0.13 上测试)。还有另外两个库用于访问 MINC 文件中的数据:MINC 版本 1.x 库和 volume_io。绝大多数现有的代码使用这两个库中的一个;MINC2 是最近引入的一个新库。一个重要的区别是 MINC2 只能读取 2.x 版本的文件;旧文件必须使用 mincconvert 命令进行转换。

在本教程中,我们将把代码分解并逐段注释。每个教程的末尾都可以找到未经修改的源代码。

代码以以下方式编译(假设 minc-toolkit-v2 安装在 /opt/minc/1.9.15 中)

gcc -g -o minc2_tutorial1  -I /opt/minc/1.9.15/include -L /opt/minc/1.9.15/lib -lminc2 -lhdf5 -lniftiio -lznz -lz -lm -ldl -lrt -lnetcdf minc2_tutorial1.c

Hello World

[编辑 | 编辑源代码]

现在开始 Hello World 示例。在这里,我们打开一个 MINC2 卷,并获取第一个体素的值。

#include <minc2.h>
#include <stdio.h>

包含文件 - 仅需要 minc2.h 来获取所有 minc2 功能。

int main(int argc, char **argv) {
  mihandle_t    minc_volume;
  double        voxel;
  int           result;
  unsigned long location[3];

数据类型:这里唯一非标准的类型是 mihandle_t,这是一个结构体,几乎所有需要在 minc2 卷上执行某些操作的 minc2 函数都需要使用它。

  /* open the volume - first and only command line argument */
  result = miopen_volume(argv[1], MI2_OPEN_READ, &minc_volume);
  /* check for error on opening */
  if (result != MI_NOERROR) {
    fprintf(stderr, "Error opening input file: %d.\n", result);
  }


这是第一个 minc2 命令:miopen_volume,正如你所料,它打开一个由 C 字符串指定的 minc2 卷,一个指示文件是应该打开进行读取还是写入的标志(在本例中为读取),以及 mihandle_t 结构体的地址,如果操作成功,它将保存有关卷的重要信息。

  /* get the first voxel in the image */
  location[0] = location[1] = location[2] = 0;
  miget_real_value(minc_volume, location, 3, &voxel);
  printf("Hello MINC2 - first voxel was: %f\n", voxel);

  return(0);
}

现在我们获取第一个体素,它由体积坐标 0,0,0 指定。我们在这里只查看三维体积,因此我们创建了一个包含三个元素的 unsigned long 数组,并将它们都设置为 0。然后,我们调用 miget_real_value 函数,指定用于获取体素的卷句柄、位置(unsigned long 数组)、文件中维度的数量以及要分配体素值的 double 的地址。然后,我们将其打印到终端。

就是这样 - 第一个也是非常简单的 MINC2 程序,实际上只需要两个库调用:打开卷和获取体素。

#include <minc2.h>
#include <stdio.h>

int main(int argc, char **argv) {
  mihandle_t    minc_volume;
  double        voxel;
  int           result;
  misize_t      location[3];
  
  /* open the volume - first and only command line argument */
  result = miopen_volume(argv[1], MI2_OPEN_READ, &minc_volume);
  /* check for error on opening */
  if (result != MI_NOERROR) {
    fprintf(stderr, "Error opening input file: %d.\n", result);
  }

  /* get the first voxel in the image */
  location[0] = location[1] = location[2] = 0;
  miget_real_value(minc_volume, location, 3, &voxel);
  printf("Hello MINC2 - first voxel was: %f\n", voxel);

  return(0);
}
华夏公益教科书