FloatType图像ITK上的分段错误

时间:2017-11-30 00:15:07

标签: c++ vtk itk mitk

尝试向 ikt ::带浮点像素类型的图像显示或应用任何滤镜时,我得到分段错误。 我可以使用相同的代码(交换像素类型)打开带有 unsigned char像素类型的图像,它可以正常工作。 我提到的两个图像(浮点像素和无符号字符)都是Nifti类型。

我也用ImageIOBase打开图像来检查像素类型及其确实浮动。

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkExtractImageFilter.h"
#include "itkImageToVTKImageFilter.h"
#include "vtkImageViewer.h"
#include "vtkImageMapper3D.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkSmartPointer.h"
#include "vtkImageActor.h"
#include "vtkInteractorStyleImage.h"
#include "vtkRenderer.h"
#include "itkRGBPixel.h"
#include <unistd.h>
#include "QuickView.h"
#include <armadillo>
#include "itkBinaryThresholdImageFilter.h"
#include "itkMedianImageFilter.h"



typedef float FloatPixelType;
typedef itk::Image<FloatPixelType,  3> Input3DFloatImageType;
typedef itk::Image<FloatPixelType, 2> FloatImageType;
typedef itk::ImageFileReader< Input3DFloatImageType> Float3DReaderType;
typedef itk::ImageToVTKImageFilter<FloatImageType> FloatConnectorType;
typedef itk::ExtractImageFilter< Input3DFloatImageType, FloatImageType > FloatFilterType;

int main(int argc, char *argv[]){

const char * grayMatterFile = "../../I3T/I3TGM.img";
Float3DReaderType::Pointer floatReader = Float3DReaderType::New();
floatReader->SetFileName( grayMatterFile );

FloatFilterType::Pointer floatFilter = FloatFilterType::New();
floatFilter->SetDirectionCollapseToSubmatrix();
floatFilter->InPlaceOn();
floatReader->UpdateOutputInformation();
Input3DFloatImageType::RegionType floatRegion = floatReader->GetOutput()->GetLargestPossibleRegion();

Input3DFloatImageType::SizeType floatSize = floatRegion.GetSize();
floatSize[1] = 0;
Input3DFloatImageType::IndexType floatIndexStart = floatRegion.GetIndex();

for(int i = 0; floatRegion.GetSize()[1]; i++){

        floatIndexStart[1] = i;
        Input3DFloatImageType::RegionType floatDesiredRegion;

        floatDesiredRegion.SetSize( floatSize);
        floatDesiredRegion.SetIndex( floatIndexStart);

        // Float image
        floatFilter->SetInput( floatReader->GetOutput() );
        floatFilter->SetExtractionRegion( floatDesiredRegion ); 
        floatFilter->Update();
        ShowImage<FloatImageType>(floatFilter->GetOutput());


    }
}

template<typename TImageType>
void ShowImage(typename TImageType::Pointer image){

    typedef itk::ImageToVTKImageFilter<TImageType> ThisConnectorType;
    typename ThisConnectorType::Pointer connector = ThisConnectorType::New();
    connector->SetInput(image);

    try{
        connector->Update();
     } catch( itk::ExceptionObject & error ) {
        std::cerr << "Error: " << error << std::endl;
        return;
     }


    vtkSmartPointer<vtkImageActor> actor =  vtkSmartPointer<vtkImageActor>::New();

    actor->GetMapper()->SetInputData(connector->GetOutput());

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->ResetCamera();

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();

    renderWindowInteractor->SetInteractorStyle(style);

    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderWindowInteractor->Initialize();

    renderWindowInteractor->Start();

}
  

分段错误发生在行中:floatFilter-&gt; Update();

有什么想法吗?先谢谢!

1 个答案:

答案 0 :(得分:1)

floatFilter->Update();之前缺少ShowImage

修改

您的更新代码(稍作修改)在我的计算机上运行。您的ITK或VTK安装可能会被破坏。尝试使用IDE在调试模式下运行它,它将显示发生故障的位置。