2015-01-21 8 views
0

Я пытаюсь вычислить градиент изображения. Я попробовал this code на образце (Gourds6.png).ITK: Не удалось создать объект IO

Я использовал 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. 

Я не сделал никаких изменений в этом коде. Он должен работать. Я не знаю, что случилось с ним :(У вас есть какие-либо идеи?

Кроме того, почему мы не должны обновить читателя прочитать файл? Почему мы только обновить записи?

Я ценю за любую помощь!

ответ

3

Тип пикселя выходного файла в 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() и так далее.

+0

Спасибо за ваш ответ :) У меня была идея конвертировать, но потом я подумал, что этот код поставляется с данным образцом (который находится в формате png), поэтому он должен работать! –

+0

*** DICOM (.dic: не удалось на моем ПК) *** Наиболее распространенным расширением для файлов dicom является .dcm. – drescherjm

Смежные вопросы