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