VTK读取序列图像

    本人实验室有160KV的工业CT,可以自己采集CT数据,并且进行二维和三维重。三维重建主要使用VTK。通常,需要处理数据量都比较大(单个样品的数据10GB左右),虽然有6核的戴尔工作站去处理这些数据,但是还是显得非常吃力。在有限的硬件资源下,只能减少计算量了。例如,在用VTK进行三维重建的过程中,如果整体数据量比较庞大,但又希望重建样品的整体外貌时,可以只对编号为1、3、5...的切片进行重建,这样就可以减少了一半的内存需要量和计算量。   

    虽然网上有很多VTK使用的例程,多数没有提及这个问题(或许是多数人都不会面对这么庞大的数据,因此没有这个需要吧)。因此,在本文中,将下结合本人的实践探索,总结出实现这个目的的方法。

实例:

vtkSmartPointer<vtkImageReader> reader = vtkSmartPointer<vtkImageReader>::New(); 
	reader->SetFileDimensionality(2);
	reader->SetFileNameSliceSpacing(5); // 序列图像文件编号的间隔
	reader->SetDataExtent(0,61,0,61,20,160);// 和上面的设置共通过确定了实际读取的图像编号
	reader->SetDataScalarTypeToUnsignedChar(); 
	reader->SetFilePattern("%s%03d.raw"); // 设置文件名的形式,03表示索引的位数,必须以0开头
	reader->SetFilePrefix("E:/HRAW/root_slice_uint8_62x62/SLICE_uint8_62x62_");
	reader->SetDataSpacing (1.0, 1.0, 0.25);
	reader->SetDataByteOrderToLittleEndian(); 
分析:

1、下面函数指定了图像文件编号的间隔为5,即文件的有效编号为0、5、10、15...

reader->SetFileNameSliceSpacing(5); 
2、下面函数的最后2个参数,确定选取有效编号中的哪些部分
reader->SetDataExtent(0,61,0,61,20,160);
    上面的参数20,表示有效编号第20个。本例中,第0个有效编号为0,第1个为5,第2个为10...因此,第20个有效编号就是20*5=100;同理参数160表示第160个有效编号160*5=800。所以,

    所以,通过上面两个函数的设置,可以达到的目的是:只读取编号为100、105、110、...、800的图像文件。


参考资料

VTK序列图像的读取

你可能感兴趣的:(VTK读取序列图像)