Discussion:
[ITK-users] ITK and VTK connection problem
Ashef Shahrior
2018-07-05 13:52:02 UTC
Permalink
From ITK Software Guide Book, I am trying to do Region Growing - Connected
Threshold segmentation and show it using VTK. In the guide book, the
segmented image is written into another file. But I don't want to write it
but rather display it using VTK renderer. But it seems to be not working.
Can anyone see my code and help me out, please? Here's my code:

#include <iostream>
#include <string.h>
#include <windows.h>
#include <time.h>
#include <dos.h>

#include "itkConnectedThresholdImageFilter.h"

#include "itkImage.h"
#include "itkCastImageFilter.h"

#include "itkCurvatureFlowImageFilter.h"

#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"

#include "itkVTKImageExport.h"
#include "itkVTKImageImport.h"
#include "itkRGBPixel.h"

#include "vtkImageData.h"
#include "vtkImageImport.h"
#include "vtkImageExport.h"
#include "vtkImageActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkInteractorStyleImage.h"

using namespace std;

template <typename ITK_Exporter, typename VTK_Importer> void
ConnectPipelines(ITK_Exporter exporter, VTK_Importer* importer)
{

importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());

importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
importer->SetSpacingCallback(exporter->GetSpacingCallback());
importer->SetOriginCallback(exporter->GetOriginCallback());
importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());

importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());

importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
importer->SetDataExtentCallback(exporter->GetDataExtentCallback());

importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
importer->SetCallbackUserData(exporter->GetCallbackUserData());
}

template <typename VTK_Exporter, typename ITK_Importer> void
ConnectPipelines(VTK_Exporter* exporter, ITK_Importer importer)
{

importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());

importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
importer->SetSpacingCallback(exporter->GetSpacingCallback());
importer->SetOriginCallback(exporter->GetOriginCallback());
importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());

importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());

importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
importer->SetDataExtentCallback(exporter->GetDataExtentCallback());

importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
importer->SetCallbackUserData(exporter->GetCallbackUserData());
}


void main()
{
char inputImage[1000], seedx[10], seedy[10], lThreshold[100],
uThreshold[100];

cout<< "Input values: "<<endl;
cin >> inputImage;
cin>>seedx;
cin>>seedy;
cin>>lThreshold;
cin>>uThreshold;

const unsigned int Dimension = 2;

typedef float InternalPixelType;
typedef itk::Image< InternalPixelType, Dimension > InternalImageType;

typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;

typedef itk::CurvatureFlowImageFilter< InternalImageType,
InternalImageType > CurvatureFlowImageFilterType;

CurvatureFlowImageFilterType::Pointer smoothing =
CurvatureFlowImageFilterType::New();

typedef itk::ConnectedThresholdImageFilter< InternalImageType,
InternalImageType > ConnectedFilterType;

ConnectedFilterType::Pointer connectedThreshold =
ConnectedFilterType::New();

typedef itk::CastImageFilter< InternalImageType, OutputImageType >
CastingFilterType;

CastingFilterType::Pointer caster = CastingFilterType::New();

typedef itk::ImageFileReader< InternalImageType > ReaderType;
typedef itk::ImageFileWriter< OutputImageType > WriterType;

ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();

reader->SetFileName( inputImage );
reader->Update();
//writer->SetFileName( outputImage );

smoothing->SetInput( reader->GetOutput() );
smoothing->SetNumberOfIterations( 5 );
smoothing->SetTimeStep( 0.125 );

//writer->SetInput( caster->GetOutput() );
const InternalPixelType lowerThreshold = atof( lThreshold );
const InternalPixelType upperThreshold = atof( uThreshold );

connectedThreshold->SetInput( smoothing->GetOutput() );
connectedThreshold->SetLower( lowerThreshold );
connectedThreshold->SetUpper( upperThreshold );

connectedThreshold->SetReplaceValue( 255 );

InternalImageType::IndexType index;

index[0] = atoi( seedx );
index[1] = atoi( seedy );

connectedThreshold->SetSeed( index );
connectedThreshold->Update();

//caster->SetInput( connectedThreshold->GetOutput() );
caster->SetInput(connectedThreshold->GetOutput());

typedef itk::VTKImageExport< InternalImageType > ExportFilterType; //
ExportFilterType::Pointer itkExporter = ExportFilterType::New(); //

//itkExporter->SetInput( caster->GetOutput() ); // this line gives
me error warning, so i did the following line
itkExporter->SetInput(connectedThreshold->GetOutput());



vtkImageImport* vtkImporter = vtkImageImport::New(); //
ConnectPipelines(itkExporter, vtkImporter);

typedef itk::VTKImageImport< InternalImageType > ImportFilterType; //
ImportFilterType::Pointer itkImporter = ImportFilterType::New(); //


vtkImageExport* vtkExporter = vtkImageExport::New();
ConnectPipelines(vtkExporter, itkImporter);

#if VTK_MAJOR_VERSION <= 5
vtkExporter->SetInput( vtkImporter->GetOutput() );
#else
vtkImporter->Update();
vtkExporter->SetInputData( vtkImporter->GetOutput() );
#endif

vtkImageActor* actor = vtkImageActor::New();
#if VTK_MAJOR_VERSION <= 5
actor->SetInput(vtkImporter->GetOutput());
#else
actor->SetInputData(vtkImporter->GetOutput());
#endif

vtkInteractorStyleImage * interactorStyle =
vtkInteractorStyleImage::New();

vtkRenderer* renderer = vtkRenderer::New();
vtkRenderWindow* renWin = vtkRenderWindow::New();
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();

renWin->SetSize(500, 500);
renWin->AddRenderer(renderer);
iren->SetRenderWindow(renWin);
iren->SetInteractorStyle( interactorStyle );

renderer->AddActor(actor);
renderer->SetBackground(0.4392, 0.5020, 0.5647);

renWin->Render();
iren->Start();

actor->Delete();
interactorStyle->Delete();
vtkImporter->Delete();
vtkExporter->Delete();
renWin->Delete();
renderer->Delete();
iren->Delete();
}

Thanks in advance.
Matt McCormick
2018-07-05 15:56:31 UTC
Permalink
Hi,

The itk::ImageToVTKImageFilter should be used instead of the
itk::VTKImageImport class directly. See, for example:

https://itk.org/ITKExamples/src/Bridge/VtkGlue/ConvertAnitkImageTovtkImageData/Documentation.html

HTH,
Matt
Post by Ashef Shahrior
#include <iostream>
#include <string.h>
#include <windows.h>
#include <time.h>
#include <dos.h>
#include "itkConnectedThresholdImageFilter.h"
#include "itkImage.h"
#include "itkCastImageFilter.h"
#include "itkCurvatureFlowImageFilter.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkVTKImageExport.h"
#include "itkVTKImageImport.h"
#include "itkRGBPixel.h"
#include "vtkImageData.h"
#include "vtkImageImport.h"
#include "vtkImageExport.h"
#include "vtkImageActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkInteractorStyleImage.h"
using namespace std;
template <typename ITK_Exporter, typename VTK_Importer> void ConnectPipelines(ITK_Exporter exporter, VTK_Importer* importer)
{
importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
importer->SetSpacingCallback(exporter->GetSpacingCallback());
importer->SetOriginCallback(exporter->GetOriginCallback());
importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
importer->SetCallbackUserData(exporter->GetCallbackUserData());
}
template <typename VTK_Exporter, typename ITK_Importer> void ConnectPipelines(VTK_Exporter* exporter, ITK_Importer importer)
{
importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
importer->SetSpacingCallback(exporter->GetSpacingCallback());
importer->SetOriginCallback(exporter->GetOriginCallback());
importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
importer->SetCallbackUserData(exporter->GetCallbackUserData());
}
void main()
{
char inputImage[1000], seedx[10], seedy[10], lThreshold[100], uThreshold[100];
cout<< "Input values: "<<endl;
cin >> inputImage;
cin>>seedx;
cin>>seedy;
cin>>lThreshold;
cin>>uThreshold;
const unsigned int Dimension = 2;
typedef float InternalPixelType;
typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
typedef itk::CurvatureFlowImageFilter< InternalImageType, InternalImageType > CurvatureFlowImageFilterType;
CurvatureFlowImageFilterType::Pointer smoothing = CurvatureFlowImageFilterType::New();
typedef itk::ConnectedThresholdImageFilter< InternalImageType, InternalImageType > ConnectedFilterType;
ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();
typedef itk::CastImageFilter< InternalImageType, OutputImageType > CastingFilterType;
CastingFilterType::Pointer caster = CastingFilterType::New();
typedef itk::ImageFileReader< InternalImageType > ReaderType;
typedef itk::ImageFileWriter< OutputImageType > WriterType;
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
reader->SetFileName( inputImage );
reader->Update();
//writer->SetFileName( outputImage );
smoothing->SetInput( reader->GetOutput() );
smoothing->SetNumberOfIterations( 5 );
smoothing->SetTimeStep( 0.125 );
//writer->SetInput( caster->GetOutput() );
const InternalPixelType lowerThreshold = atof( lThreshold );
const InternalPixelType upperThreshold = atof( uThreshold );
connectedThreshold->SetInput( smoothing->GetOutput() );
connectedThreshold->SetLower( lowerThreshold );
connectedThreshold->SetUpper( upperThreshold );
connectedThreshold->SetReplaceValue( 255 );
InternalImageType::IndexType index;
index[0] = atoi( seedx );
index[1] = atoi( seedy );
connectedThreshold->SetSeed( index );
connectedThreshold->Update();
//caster->SetInput( connectedThreshold->GetOutput() );
caster->SetInput(connectedThreshold->GetOutput());
typedef itk::VTKImageExport< InternalImageType > ExportFilterType; //
ExportFilterType::Pointer itkExporter = ExportFilterType::New(); //
//itkExporter->SetInput( caster->GetOutput() ); // this line gives me error warning, so i did the following line
itkExporter->SetInput(connectedThreshold->GetOutput());
vtkImageImport* vtkImporter = vtkImageImport::New(); //
ConnectPipelines(itkExporter, vtkImporter);
typedef itk::VTKImageImport< InternalImageType > ImportFilterType; //
ImportFilterType::Pointer itkImporter = ImportFilterType::New(); //
vtkImageExport* vtkExporter = vtkImageExport::New();
ConnectPipelines(vtkExporter, itkImporter);
#if VTK_MAJOR_VERSION <= 5
vtkExporter->SetInput( vtkImporter->GetOutput() );
#else
vtkImporter->Update();
vtkExporter->SetInputData( vtkImporter->GetOutput() );
#endif
vtkImageActor* actor = vtkImageActor::New();
#if VTK_MAJOR_VERSION <= 5
actor->SetInput(vtkImporter->GetOutput());
#else
actor->SetInputData(vtkImporter->GetOutput());
#endif
vtkInteractorStyleImage * interactorStyle = vtkInteractorStyleImage::New();
vtkRenderer* renderer = vtkRenderer::New();
vtkRenderWindow* renWin = vtkRenderWindow::New();
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
renWin->SetSize(500, 500);
renWin->AddRenderer(renderer);
iren->SetRenderWindow(renWin);
iren->SetInteractorStyle( interactorStyle );
renderer->AddActor(actor);
renderer->SetBackground(0.4392, 0.5020, 0.5647);
renWin->Render();
iren->Start();
actor->Delete();
interactorStyle->Delete();
vtkImporter->Delete();
vtkExporter->Delete();
renWin->Delete();
renderer->Delete();
iren->Delete();
}
Thanks in advance.
The ITK community is transitioning from this mailing list to discourse.itk.org. Please join us there!
________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
http://www.kitware.com/products/protraining.php
http://www.itk.org/Wiki/ITK_FAQ
https://itk.org/mailman/listinfo/insight-users
The ITK community is transitioning from this mailing list to discourse.itk.org. Please join us there!
________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://www.kitware.com/products/protraining.php

Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ

Follow this link to subscribe/unsubscribe:
https://itk.org/mailman/listinfo/insight-users

Loading...