有时候我们想读取得图像格式VTK中没有相应的IO类支持或者图像格式是一些商家自定义的(医疗图像中经常会有这种情况)。这时候VTK为我们提供了一个vtkImageReader 类,该类提供了读取原始数据的办法,但需要我们设定待读去图像的宽度、高度、像素类型等一系列参数。以我所接触到的图像格式做说明。hraw格式是160kv工业CT所获取的切片图像格式类型。该种类型是CT生产商家自定义的图像格式。其图像相关信息的文件头位于图像尾部。文件头格式如下:
typedef struct { unsigned long m_iWidth; //图像宽度******** ,4字节 unsigned long m_iHeight; //图像高度********,4字节 unsigned long m_iLength; //图像序列长度 ********1,4字节 unsigned long m_iDataType; //图像数据类型******** 4-ushort 7-float,4字节 unsigned long m_iDataPixelBytes;//像素的字节数 ,4字节 INT64 m_iDataTotalSize; //图像数据总长度(注意,不包括用户自定义信息长度),8字节 VERSIONINFO m_versionInfo; //软件版本号,4字节 int m_iFileType; //文件类型,4字节 float m_iPixelSizeX; //像素尺寸,4字节 float m_iPixelSizeY; //像素尺寸,4字节 unsigned long m_iHeadOffset; //数据从文件头的偏移量,4字节 unsigned long m_iUserInfoLength;//用户自定义信息长度,4字节 int m_iUnDefinedArray[51]; //备用字节,4*51=204字节 }HRAWHEADINFO; //256字节
其中对vtkImagereader比较有用的信息就只有三个:高度 宽度 类型。 所以我们需要编写文件操作函数以二进制文件形式打开文件获取这三个参数。
下面贴出VTK读取裸数据相关代码:
//使用vtkImageReader类读取裸数据 vtkSmartPointer<vtkImageReader> reader=vtkSmartPointer<vtkImageReader>::New(); reader->SetHeaderSize(0); //很重要 因为hraw文件信息放在文件尾 ,所以文件头尺寸应该为0 reader->SetNumberOfScalarComponents(1); reader->SetFileDimensionality(2); reader->SetFilePrefix("E:/RootImgs/01C/HRAW/01C"); reader->SetFilePattern("%s%04d.hraw"); //%04d表示:显示4位数 不足的拿0补齐 reader->SetDataExtent(0,h-1,0,w-1,1,1); reader->SetDataOrigin(0.0, 0.0, 0.0); if(type==1) { reader->SetDataScalarTypeToUnsignedShort();} //设置数据类型为ushort if(type==2) {reader->SetDataScalarTypeToFloat();}ushort //设置数据类型为float // reader->SetDataByteOrderToBigEndian(); reader->SetDataByteOrderToLittleEndian(); reader->UpdateWholeExtent();注: 比较重要的 几个点
SetDataExtent(); 设置数据的尺寸 最后两个参数作为读取的图像序列号范围
关于读取序列图像有两种方式;(参考文献1)
1 reader 类提供了SetfileNames() 可以设置多个文件名。具体操作可以用vtkStringArray类 通过循环语句读取到文件名列表 然后作为setfilenames的参数
2 使用reader类提供的setFilePix()和SetFilePattern(),两个函数获取序列图像
reader->SetFilePrefix("E:/RootImgs/01C/HRAW/01C"); reader->SetFilePattern("%s%04d.hraw"); //%04d表示:显示4位数 不足的拿0补齐setfileprefix 是文件名相同的部分
setfilepattern 设置文件名不同的部分
参考文献:
【1】VTK都序列图像
【2】VTK图形图像进阶