三、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;
    //创建reader,设置读取的文件名
    using ReaderType=itk:: ImageFileReader;
    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;
    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::Image2>;
    using RescaleFilterType=itk::RescaleIntensityImageFilter;
    RescaleFilterType::Pointer rescaler = RescaleFilterType::New();
    rescaler->SetOutputMinimum(0);
    rescaler->SetOutputMaximum(255);
    //再次创建一个writer,写入到文件,这个时候文件以及变成了一个灰度图
    using Writer2Type=itk::ImageFileWriter;
    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;
    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

你可能感兴趣的:(三、ITK的dcm图像读写)