ITK讀DICOM數據

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開發的數字圖像處理軟件中,結果如圖所示:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章