需要處理序列的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;
}