我正在尝试计算图像的渐变。我在给出的样本图像(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.
我没有对此代码进行任何更改。它应该工作。我不知道它有什么问题:(你有什么想法吗?
另外,为什么我们不需要更新阅读器来阅读图像?为什么我们只更新作者?
我感谢任何帮助!
答案 0 :(得分:4)
this example of ITK中输出文件的像素类型为float
。并且无法将float
的图像写为PNG图像。
the wiki of ITK上提供了支持的文件格式和相应数据类型的列表。
要保存float
的此图像,以下是预期可用的格式:
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()
,依此类推。