三、ITK的dcm圖像讀寫


一、主要功能

  1、讀取單張dcm圖像

  2、寫入單張dcm圖像

  3、圖像調整之后以.jpg格式寫入

  4、調整之后重新以.dcm格式寫入

二、代碼

  

#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkGDCMImageIO.h"
#include "itkJPEGImageIOFactory.h"
int main(int argc,char *argv[])
{
    //設置讀取圖像類型
    using InputPixelType=signed short;
    const unsigned int InputDimension = 2;
    using InputImageType=itk::Image<InputPixelType, InputDimension>;
    //創建reader,設置讀取的文件名
    using ReaderType=itk:: ImageFileReader<InputImageType>;
    ReaderType::Pointer reader = ReaderType::New();
    //
    reader->SetFileName("D:\\Files\\ITKFiles\\ITK-4-ReadSingleDCM\\Data\\I10.dcm");
    //創建讀取DCM的GDCMIOImage類
    using ImageIOType =itk::GDCMImageIO;
    ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
    reader->SetImageIO(gdcmImageIO);
    //調用Update()觸發過程,放置在try-catch模塊
    try
    {
        reader->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "exception in file reader" << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }
    //實例化一個writer保存圖片
    using WriterType=itk::ImageFileWriter<InputImageType>;
    WriterType::Pointer writer1 = WriterType::New();
    writer1->SetFileName("D:\\Files\\ITKFiles\\ITK-4-ReadSingleDCM\\Data\\result.dcm");
    writer1->SetInput(reader->GetOutput());
    //對writer設置合適的圖像IO,告訴圖像該如何寫入
    writer1->SetImageIO(gdcmImageIO);
    //調用Update()觸發程序
    try
    {
        writer1->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "exception in file writer" << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }
    //使用調節圖像亮度濾波器對圖像進行調節,使用無符號char類型
    //類型轉換
    using WriterPixelType=unsigned char;
    using WriteImageType=itk::Image<WriterPixelType,2>;
    using RescaleFilterType=itk::RescaleIntensityImageFilter<InputImageType, WriteImageType>;
    RescaleFilterType::Pointer rescaler = RescaleFilterType::New();
    rescaler->SetOutputMinimum(0);
    rescaler->SetOutputMaximum(255);
    //再次創建一個writer,寫入到文件,這個時候文件以及變成了一個灰度圖
    using Writer2Type=itk::ImageFileWriter<WriteImageType>;
    Writer2Type::Pointer writer2 = Writer2Type::New();
    writer2 ->SetFileName("D:\\Files\\ITKFiles\\ITK-4-ReadSingleDCM\\Data\\1.jpg");
    rescaler->SetInput(reader->GetOutput());
    writer2->SetInput(rescaler->GetOutput());
    itk::JPEGImageIOFactory::RegisterOneFactory();
    try
    {
        writer2->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "Exception in file writer " << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }
    //在此設置一個wirter,將調節之后的圖像寫入到文件
    using Writer3Type=itk::ImageFileWriter<WriteImageType>;
    Writer3Type::Pointer writer3 = Writer3Type::New();
    writer3->SetFileName("D:\\Files\\ITKFiles\\ITK-4-ReadSingleDCM\\Data\\rescale.dcm");
    writer3->SetInput(rescaler->GetOutput());
    //設置圖像IO,告訴writer通過GDCMImageIO輸出, IO包含了DICOM的精確信息
    writer3->UseInputMetaDataDictionaryOff();
    writer3->SetImageIO(gdcmImageIO);
    try
    {
        writer3->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "Exception in file writer " << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

三、注意問題

  1、我最初下載的dcm文件是沒有后綴的,所以讀取的時候沒有.dcm后綴,但是程序也運行成功了。

  2、如果希望能夠讀取的是dcm圖片,可以直接修改后綴(我一直覺得不修改就覺得怪怪的)

  3、rescale濾波器功能應該是縮放圖片亮度(也就是灰度級,這個是我猜測的,還沒有驗證過)

四、未解決問題

  第四個寫入的圖片rescale.dcm圖片,不知道為什么,在寫入之后,通過dcm瀏覽器查看的時候,發現是全黑的,其他的都是正常的。

  這一點沒有搞清楚

五、參考

  醫學圖像分割與配准 7.12 Page224-226


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM