我正在尝试为 cgal 库创建灰度 .inr 图像,但我在文件格式方面遇到问题。
这似乎是对格式的最佳描述,但它看起来并不完整,只谈论标题,而不是数据本身。
这似乎有更多关于格式的信息,但不幸的是它是法语的。
我试图做的是将一个对象表示为一个充满布尔值的 3D 数组,因此如果一个位置在对象内部,则其值为 1,如果位于对象外部,则值为 0。
如果我理解正确的话,我现在所做的是基于第二个链接,是在标题后面写一行上的每个 z 平面,下一个 z 平面在新行上。
所以我在代表第一行的行上有列的 x 值,然后是同一行上第二行的 x 值,就像 y 次直到最后一行。然后,我为新的 z 平面跳一行并以相同的方式写入数据。
我已经创建了以下 .inr 文件,但是当我尝试对其进行网格划分时,结果是一个立方体而不是圆柱体,就好像 cgal(我使用 mesh_optimization_lloyd_example)不关心布尔值,只是网格化了整个体积。
我尝试查看示例提供的 .inr 文件(如 skull_2.9.inr),但是虽然标题非常清晰,但没有文本编辑器可以读取图像数据,这让我认为可能不仅仅是写 0 或 1。
是 .inr 有什么问题吗?或者也许我用错了 cgal?
我终于设法让它工作了,这是它帮助某人所需要的。
标头:必须是 256 字节的倍数,包括标头末尾后的回车符,下面是一个示例。
#INRIMAGE-4#{ // format type
XDIM=150 // x dimension
YDIM=200 // y dimension
ZDIM=100 // z dimension
VDIM=1 // dimension of the data, here 1 for scalar or 3 for thing like RGB values
VX=5 // voxel size in x
VY=5 // voxel size in y
VZ=5 // voxel size in z
// a higher voxel size results in a more precise 3D mesh
TYPE=unsigned fixed // type of data written, can float, signed fixed or unsigned fixed, unclear if it makes a difference in my case
SCALE=2**0 // not used by most programs apparently
PIXSIZE=8 bits // size of a char, can be 8, 16, 32 or 64
CPU=pc // the type of cpu for little/big endianness, pc is little endian
// Fill with carriage returns until the header is a multiple of 256 bytes, including the end of the header (4 bytes including the line break)
##} // the line break is included in the header count
现在数据本身:
尽管文档似乎暗示了什么,但它中没有换行符,一切都是连续的。数据必须以二进制而不是 ASCII 写入(因此在我的情况下C++这将是static_cast(空格[i][j][k])),将字符替换为您使用的数据类型)。
最后一个怪癖是,该文件似乎是按列主顺序排列的,因此,如果您有一个 C 格式的 3d 数组(这是行主数组),则需要在编写之前转置 (x,y) 平面。