一、主要功能
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