dcm 圖像批量保存png

  需要處理序列的dcm文件,vtk的dcmread兼容性太差,利用itk讀取dcm讓後轉成vti文件。利用imagecast可以直接轉成unsigned char 保存成png。我還需要opencv操作下,乾脆就把vti轉成cv::mat保存了。

如果覺得下邊這個工程有用的話,下載:http://118.25.63.144/temporary/DcmsToPngs.zip

bool ReadDcm(const QString &input_file_name,
             const vtkSmartPointer<vtkImageData> &imagedata) {
    if (input_file_name.isEmpty()) {
        return false;
    }
    QFileInfo file_info(input_file_name);
    QString extension = file_info.path();
    using PixelType = float;
    constexpr unsigned int Dimension = 3;
    using ImageType = itk::Image< PixelType, Dimension >;
    using ReaderType = itk::ImageSeriesReader< ImageType >;
    using ImageIOType = itk::GDCMImageIO;
    using NamesGeneratorType = itk::GDCMSeriesFileNames;
    ReaderType::Pointer reader = ReaderType::New();
    ImageIOType::Pointer dicomIO = ImageIOType::New();
    reader->SetImageIO(dicomIO);
    NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
    nameGenerator->SetUseSeriesDetails(true);
    nameGenerator->SetDirectory(extension.toLocal8Bit().data());
    using SeriesIdContainer = std::vector< std::string >;
    const SeriesIdContainer &seriesUID = nameGenerator->GetSeriesUIDs();
    auto seriesItr = seriesUID.begin();
    auto seriesEnd = seriesUID.end();
    using FileNamesContainer = std::vector< std::string >;
    FileNamesContainer fileNames ;
    std::string seriesIdentifier;
    while (seriesItr != seriesEnd) {
        seriesIdentifier = seriesItr->c_str();
        fileNames = nameGenerator->GetFileNames(seriesIdentifier);
        ++seriesItr;
    }
    reader->SetFileNames(fileNames);
    try {
        reader->Update();
    } catch (itk::ExceptionObject &ex) {
        std::cout << ex << std::endl;
        return false;
    }
    ImageType::Pointer input_image;
    input_image = ImageType::New();
    input_image = reader->GetOutput();
    typedef itk::ImageToVTKImageFilter< ImageType> itkTovtkFilterType;
    itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New();
    itkTovtkImageFilter->SetInput(input_image);
    itkTovtkImageFilter->Update();
    imagedata->DeepCopy(itkTovtkImageFilter->GetOutput());
    return true;
}

bool WritePng(const vtkSmartPointer<vtkImageData> &imagedata,
              const QString &output_file) {
    qint32 dims[3];
    imagedata->GetDimensions(dims);
    for(qint32 i = 0; i < dims[2]; i++) {
        cv::Mat vtk_to_cvimg(dims[0], dims[1], CV_32FC1,
                             imagedata->GetScalarPointer(0, 0, i));
        cv::imwrite((output_file + QString("%1.png").arg(
                         i, 4, 10, QLatin1Char('0')))
                    .toLocal8Bit().data(), vtk_to_cvimg);
    }
    return true;
}

int main(int, char *[]) {
    vtkSmartPointer<vtkImageData> imagedata =
        vtkSmartPointer<vtkImageData>::New();
    ReadDcm("/home/yx/Documents/arteryflow/qt/DcmsToPngs/build-DcmsToPngs-Desktop_Qt_5_11_3_GCC_64bit-Release/dcm/0.dcm", imagedata);
    WritePng(imagedata, "/home/yx/Documents/arteryflow/qt/DcmsToPngs/build-DcmsToPngs-Desktop_Qt_5_11_3_GCC_64bit-Release/tmp/");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章