2 利用ITK实现多帧Dicom读取,VTK实现数据显示

本文介绍了如何在VTK中使用ITK进行多帧DICOM数据的读取,包括编译ITK并解决遇到的问题,以及如何将ITK数据转换为VTK格式以便于三维显示。还提到在显示VTKImageData时可能遇到的权限问题及解决方案。

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::New
首先需要安装ITKVTK库,然后按照以下步骤实现读取DICOM文件并转换为VTK数据: 1. 导入相关头文件: ```cpp #include "itkImageSeriesReader.h" #include "itkGDCMImageIO.h" #include "itkGDCMSeriesFileNames.h" #include "itkImageToVTKImageFilter.h" ``` 2. 设置DICOM文件夹路径和输出VTK文件路径: ```cpp std::string inputPath = "path/to/dicom/folder"; std::string outputPath = "path/to/output/vtk/file.vtk"; ``` 3. 使用itkGDCMSeriesFileNames类获取DICOM文件名列表: ```cpp itk::GDCMSeriesFileNames::Pointer nameGenerator = itk::GDCMSeriesFileNames::New(); nameGenerator->SetUseSeriesDetails(true); nameGenerator->AddSeriesRestriction("0008|0021"); nameGenerator->SetDirectory(inputPath); std::vector<std::string> seriesUID = nameGenerator->GetSeriesUIDs(); std::vector<std::string> seriesFileNames = nameGenerator->GetFileNames(seriesUID[0]); ``` 4. 使用itkImageSeriesReader类读取DICOM文件: ```cpp typedef itk::Image<short, 3> ImageType; itk::ImageSeriesReader<ImageType>::Pointer reader = itk::ImageSeriesReader<ImageType>::New(); reader->SetImageIO(itk::GDCMImageIO::New()); reader->SetFileNames(seriesFileNames); reader->Update(); ImageType::Pointer image = reader->GetOutput(); ``` 5. 将ITK图像转换为VTK图像: ```cpp typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType; ConnectorType::Pointer connector = ConnectorType::New(); connector->SetInput(image); connector->Update(); vtkSmartPointer<vtkImageData> vtkImage = connector->GetOutput(); ``` 6. 将VTK图像写入文件: ```cpp vtkSmartPointer<vtkXMLImageDataWriter> writer = vtkSmartPointer<vtkXMLImageDataWriter>::New(); writer->SetFileName(outputPath.c_str()); writer->SetInputData(vtkImage); writer->Write(); ``` 这样就完成了将DICOM文件转换为VTK数据的过程。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值