ITK读DICOM数据

来源:互联网 发布:网络直播靠什么赚钱 编辑:程序博客网 时间:2024/06/15 10:33

ITK提供强大的图像处理功能,VTK则提供强大的图像可视化功能。
比较VTK而言,ITK能够获取更全面的DICOM头文件中所包含的医学信息和病人信息。ITK能够读单张图片或序列图片。

(1)ITK能够读单张图片并获取头文件中信息:

    typedef signed short InputPixelType;//dicom 对应数据类型    const unsigned int   InputDimension = 2;    typedef itk::Image< InputPixelType, InputDimension > InputImageType;    typedef itk::ImageSeriesReader< InputImageType > ReaderType;    ReaderType::Pointer reader = ReaderType::New();    reader->SetFileName( argv[1] );    typedef itk::GDCMImageIO           ImageIOType;//GDCMImageIO读DICOM    ImageIOType::Pointer gdcmImageIO = ImageIOType::New();    //关联GDCMImageIO类后,DICOM数据信息就读入内存,ITK能获取更加全面的信息(比起VTK)    reader->SetImageIO( gdcmImageIO );    try    {        reader->Update();        reader->GetMetaDataDictionary();//获取DIOCM头文件中信息        gdcmImageIO->GetMetaDataDictionary();//获取DIOCM头文件中信息     //举例获取头文件中部分信息        char* name = new char[50];//开辟空间而不是赋初值        char* patientID = new char[50];        char* time = new char[50];        char* manufacture = new char[50];        char* modility = new char[50];        char* hospital = new char[50];        int pixelType =  gdcmImageIO->GetPixelType();        int componetType = gdcmImageIO->GetComponentType();        int fileType = gdcmImageIO->GetFileType();        ImageIOType::ByteOrder byteOrder;        byteOrder = gdcmImageIO->GetByteOrder();        unsigned int dim = 0;        gdcmImageIO->GetDimensions(dim);        ImageIOType::SizeType imgSize;        imgSize = gdcmImageIO->GetImageSizeInPixels();        int componetSize = gdcmImageIO->GetComponentSize();        int dimension = gdcmImageIO->GetNumberOfDimensions();        int ori = 0;        gdcmImageIO->GetOrigin(ori);        int spa = 0;        gdcmImageIO->GetSpacing(spa);        gdcmImageIO->GetPatientName(name);        gdcmImageIO->GetModality(modility);        gdcmImageIO->GetPatientID(patientID);        gdcmImageIO->GetManufacturer(manufacture);        gdcmImageIO->GetStudyDate(time);        ImageIOType::TCompressionType compressType;        compressType = gdcmImageIO->GetCompressionType();        gdcmImageIO->GetInstitution(hospital);        InputImageType::SpacingType type;        type = reader->GetOutput()->GetSpacing();        InputImageType::PointType origin;        origin= reader->GetOutput()->GetOrigin();    }

(1)ITK能够读序列图片

    typedef signed short    PixelType;    const unsigned int      Dimension = 3;    typedef itk::Image< PixelType, Dimension >         ImageType;    typedef itk::ImageSeriesReader< ImageType >        ReaderType;//读序列图片    ReaderType::Pointer itkReader = ReaderType::New();    typedef itk::GDCMImageIO       ImageIOType;//读DICOM图片    ImageIOType::Pointer dicomIO = ImageIOType::New();    itkReader->SetImageIO( dicomIO );//数据读入内存    typedef itk::GDCMSeriesFileNames NamesGeneratorType;    NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();    nameGenerator->SetUseSeriesDetails( true );    nameGenerator->AddSeriesRestriction("0008|0021" );    nameGenerator->SetDirectory(inputFileName);//设置文件目录    typedef std::vector< std::string >    SeriesIdContainer;    const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();    SeriesIdContainer::const_iterator seriesItr = seriesUID.begin();//迭代器    SeriesIdContainer::const_iterator seriesEnd = seriesUID.end();    std::string seriesIdentifier;    seriesIdentifier = seriesUID.begin()->c_str();//通过迭代器读取所有单张切片    typedef std::vector< std::string >   FileNamesContainer;    FileNamesContainer fileNames;    fileNames = nameGenerator->GetFileNames( seriesIdentifier );    itkReader->SetFileNames( fileNames );    itkReader->Update();    dicomIO->GetMetaDataDictionary();//获取DIOCM头文件中信息

结合ITK, VTK各自的优点,用ITK读DICOM头文件信息,用VTK显示DICOM数据。读取数据的结果在本人基于QT开发的数字图像处理软件中,结果如图所示:

这里写图片描述

0 0