ITK:无法创建IO对象

时间:2015-01-21 23:49:08

标签: c++ image itk

我正在尝试计算图像的渐变。我在给出的样本图像(Gourds6.png)上尝试了this code

我使用cmake .创建了CMakeFiles,然后使用make。一切正常,可执行文件已创建。现在,当我使用命令./computeGradient Gourds6.png out.png 1.5运行代码时,它会抱怨:

Error: 
itk::ImageFileWriterException (0x1446b40)
Location: "void itk::ImageFileWriter<TInputImage>::Write() [with TInputImage = itk::Image<float, 2u>]" 
File: /usr/local/include/ITK-4.3/itkImageFileWriter.hxx
Line: 152
Description:  Could not create IO object for file out.png
  Tried to create one of the following:
  You probably failed to set a file suffix, or
    set the suffix to an unsupported type.

我没有对此代码进行任何更改。它应该工作。我不知道它有什么问题:(你有什么想法吗?

另外,为什么我们不需要更新阅读器来阅读图像?为什么我们只更新作者?

我感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

this example of ITK中输出文件的像素类型为float。并且无法将float的图像写为PNG图像。

the wiki of ITK上提供了支持的文件格式和相应数据类型的列表。

要保存float的此图像,以下是预期可用的格式:

  • 分析(.img)
  • DICOM(.dic:在我的电脑上失败)
  • GIPL(.gipl)
  • MetaImage(mhd)(out.mhd + out.raw)
  • Nrrd(.nhdr,.nrrd)
  • 刺激(.spr)
  • VTK(.vtk)

VTK文件格式运行良好,可以由paraview软件打开。

要使用PNG格式,图片应该投放到unsigned char类型。它可以由CastImageFilter()执行。见example。另一种解决方案是使用RescaleIntensityImageFilter()。请参阅此example

This question and its answer(恰好是我的)解释了如何将float图像类型转换为“签名字符”图像类型并将其另存为PNG。

typedef itk::RescaleIntensityImageFilter< FloatImageType, UCharImageType > RescaleFilterType;
RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();

rescaleFilter ->SetInput(importFilter->GetOutput());
rescaleFilter->SetOutputMinimum(0);
rescaleFilter->SetOutputMaximum(255);

typedef itk::ImageFileWriter<  UCharImageType  > WriterType;
WriterType::Pointer writer = WriterType::New();

writer->SetFileName( "output.png" );
writer->SetInput(rescaleFilter->GetOutput() );
writer->Update();

最后,你的最后一个问题:为什么我们只更新作者?随着作者的更新,它将首先检查其条目是否是最新的。如果不是这样,它将调用filter->Update(),依此类推。