使用ITK

时间:2016-03-27 09:01:04

标签: c++ image image-processing itk writing

我正在尝试在大型ITK项目中编写一系列dicom图像。应用了大量不同的滤镜后,图像是最终的图像。我正在使用VTK的Image Plane Widget来显示我的图像。

我在编写dicom文件时遇到问题。代码写入但图像根本不正确。如果我在辐射查看器或imageJ中查看它们,它们会显示为一些扭曲的图像(见图)。 (我尝试纠正窗口级别设置,看看是否有问题)。

图:扭曲的dicom图像 Figure: distorted dicom image

在使用Microsoft Visual Studio 2010专业版的先前安装中,它正在运行。但是,我正在使用Microsoft Visual Studio 2015社区版。代码的其余部分似乎正在工作,包括在VTK的Image Plane Widget中查看结果。但是导出的文件不正确。 我阅读了有关在ITK窗口中编写dicom系列的部分,我并没有真正看到我做错了什么。

在应用滤镜的最后一步中,我将图像数据转换为8位作为带有3维的无符号字符(这是用于VTK中的进一步网格划分)和指针阈值2。

接下来我定义我的输出目录,在哪里导出thresholder2指向的数据,设置我的类型,用于将图像写为具有2维的unsinged char(因为我想要一个dicom系列,而不是一个卷),得到输出并将其传递给ImageIO,获取生成的名称并保存。

有谁知道我做错了什么?

非常感谢任何帮助。

typedef float             OutputPixelType; 
const unsigned int        Dimension = 3;
typedef itk::Image< OutputPixelType, Dimension >   OutputImageType;
typedef itk::Image< unsigned char,   Dimension >   CharImageType;
    typedef itk::BinaryThresholdImageFilter<OutputImageType, CharImageType > ThresholdingFilterType;
    ThresholdingFilterType::Pointer thresholder2 = ThresholdingFilterType::New();

    thresholder2->SetInput(geodesicActiveContour->GetOutput() );
    thresholder2->SetLowerThreshold(-1000); 
    thresholder2->SetUpperThreshold(0);
    thresholder2->SetOutsideValue( 0 ); 
    thresholder2->SetInsideValue( 255 ); 
    thresholder2->Update( );

const char * outputDirectory = "C:/ITK-VTK/dicoms_to_test_second_patient/results";
itksys::SystemTools::MakeDirectory( outputDirectory );

typedef itk::Image<unsigned char, 2 > WriteImageType;
typedef itk::ImageSeriesWriter<CharImageType,WriteImageType > SeriesWriterType;


SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
seriesWriter->SetInput(thresholder2->GetOutput() );
seriesWriter->SetImageIO(dicomIO);

nameGenerator->SetOutputDirectory( outputDirectory );
seriesWriter->SetFileNames( nameGenerator->GetOutputFileNames() );
seriesWriter->SetMetaDataDictionaryArray(reader->GetMetaDataDictionaryArray());

try
{
seriesWriter->Update();
}
catch( itk::ExceptionObject & excp )
{
std::cerr << "Exception thrown while writing the series " << std::endl;
std::cerr << excp << std::endl;
return EXIT_FAILURE;
}

0 个答案:

没有答案