vtk中也有dicom读写类,但是只能完成单帧DICOM数据读取,这对于实际应用是非常不利的。
而ITK可以实现dicom多帧读取,通常情况ITK与VTK也会结合使用(ITK处理,VTK显示),所以就一起学习下吧!
一、编译ITK
因为之后要将ITK与VTK混合编程,所以先编译生成VTK之后再进行ITK编译。
详情参考以下博文,这里不再赘述。
ITK 5.0.1 在Windows10+VS2017+CMake 环境下编译安装
ITK-001-5.2.0版本源码-编译
不过我在这里陷入了一个错误,给大家提个醒:最好不要随意改动生成好的VTK,因为ITK cmake时读取VTK中的cmake文件,会调取一些路径,如果路径被改变则会报错,不好找到原因。
另外需要注意的,在CMAKE_DEBUG_POSTFIX后面添加d这样进行Debug版本编译时会在库文件名后面多个d。
二、利用ITK实现多帧DICOM读取
先贴一下这段的代码:
itk::ImageBase<3>::Pointer DicomReadWrite::DicomReadSeries(const QString &path)
{
itk::ImageBase<3>::Pointer outImage;
// 检查路径是否有效,检查文件是否存在
if (path.isEmpty() || !QFile::exists(path)) {
return outImage;
}
std::string DirectPath = path.toStdString();
// 图像类型
using PixelType = unsigned char; // dicom图像常见像素类型
constexpr unsigned int Dimension = 3; //维度为3
using ImageType = itk::Image<PixelType, Dimension>;
// 创建dicom图像读取器
using ReaderType = itk::ImageSeriesReader<ImageType>;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName(DirectPath);
//创建GDCMImageIO对象与reader相连
using ImageIOType = itk::GDCMImageIO;
ImageIOType::Pointer gdcmImageIO = ImageIOType::