MINC/教程/编程01
任何值得称道的编程语言入门都会从一个 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 示例。在这里,我们打开一个 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);
}