Skip to content

Instantly share code, notes, and snippets.

@arnaudgelas
Created October 21, 2014 08:25
Show Gist options
  • Save arnaudgelas/3c6c7bff6fa5ff2997c8 to your computer and use it in GitHub Desktop.
Save arnaudgelas/3c6c7bff6fa5ff2997c8 to your computer and use it in GitHub Desktop.
gdcm reslice several images
project( reslice )
cmake_minimum_required( VERSION 2.6 )
find_package( GDCM REQUIRED )
include( ${GDCM_USE_FILE} )
add_executable( reslice reslice.cxx )
target_link_libraries( reslice vtkgdcm ${VTK_LIBRARIES} )
#include <vector>
#include "vtkGDCMImageReader2.h"
#include "vtkSmartPointer.h"
#include "vtkRenderer.h"
#include "vtkAssembly.h"
#include "vtkImageFlip.h"
#include "vtkImageReslice.h"
#include "vtkRenderWindow.h"
#include "vtkAnnotatedCubeActor.h"
#include "vtkTransform.h"
#include "vtkAxesActor.h"
#include "vtkTextProperty.h"
#include "vtkCaptionActor2D.h"
#include "vtkPropAssembly.h"
#include "vtkOrientationMarkerWidget.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkImageData.h"
#include "vtkLookupTable.h"
#include "vtkImageMapToColors.h"
#include "vtkImageActor.h"
#include "vtkImageMapper3D.h"
int main( int argc, char* argv[] )
{
if( argc < 2 )
{
return EXIT_FAILURE;
}
size_t N = static_cast< size_t >( argc - 1 );
vtkSmartPointer< vtkRenderer > ren = vtkSmartPointer< vtkRenderer >::New();
ren->SetBackground( 0., 0., 0.5 );
vtkSmartPointer< vtkRenderWindow > renwin = vtkSmartPointer< vtkRenderWindow >::New();
renwin->AddRenderer( ren );
vtkSmartPointer< vtkRenderWindowInteractor > iren = vtkSmartPointer< vtkRenderWindowInteractor >::New();
iren->SetRenderWindow( renwin );
vtkSmartPointer< vtkLookupTable > table = vtkSmartPointer< vtkLookupTable >::New();
table->SetNumberOfColors(1000);
table->SetTableRange(0,1000);
table->SetSaturationRange(0,0);
table->SetHueRange(0,1);
table->SetValueRange(0,1);
table->SetAlphaRange(1,1);
table->Build();
std::vector< vtkSmartPointer< vtkGDCMImageReader2 > > reader( N );
std::vector< vtkSmartPointer< vtkImageFlip > > flip( N );
std::vector< vtkSmartPointer< vtkImageReslice > > reslice( N );
std::vector< vtkSmartPointer< vtkMatrix4x4 > > invert( N );
std::vector< vtkSmartPointer< vtkImageMapToColors > > color( N );
std::vector< vtkSmartPointer< vtkImageActor > > actor( N );
for( size_t i = 0; i < N; i++ )
{
reader[i] = vtkSmartPointer< vtkGDCMImageReader2 >::New();
reader[i]->SetFileName( argv[i+1] );
reader[i]->Update();
flip[i] = vtkSmartPointer< vtkImageFlip >::New();
flip[i]->SetInputConnection(reader[i]->GetOutputPort());
flip[i]->SetFilteredAxis(0);
flip[i]->Update();
reslice[i] = vtkImageReslice::New();
reslice[i]->SetInputConnection(flip[i]->GetOutputPort());
reader[i]->GetDirectionCosines()->Print(std::cout);
invert[i] = vtkSmartPointer< vtkMatrix4x4 >::New();
invert[i]->DeepCopy( reader[i]->GetDirectionCosines() );
invert[i]->Invert();
reslice[i]->SetResliceAxes( invert[i] );
reslice[i]->Update();
color[i] = vtkSmartPointer< vtkImageMapToColors >::New();
color[i]->SetLookupTable( table );
color[i]->SetInputConnection( reslice[i]->GetOutputPort() );
actor[i] = vtkSmartPointer< vtkImageActor >::New();
actor[i]->GetMapper()->SetInputConnection( color[i]->GetOutputPort() );
ren->AddActor( actor[i] );
}
// DICOM is RAH:
vtkSmartPointer< vtkAnnotatedCubeActor > cube = vtkSmartPointer< vtkAnnotatedCubeActor >::New();
cube->SetXPlusFaceText ( "R" );
cube->SetXMinusFaceText( "L" );
cube->SetYPlusFaceText ( "A" );
cube->SetYMinusFaceText( "P" );
cube->SetZPlusFaceText ( "H" );
cube->SetZMinusFaceText( "F" );
vtkSmartPointer< vtkAxesActor > axes2 = vtkSmartPointer< vtkAxesActor >::New();
vtkSmartPointer< vtkTransform > transform = vtkSmartPointer< vtkTransform >::New();
transform->Identity();
//reader->GetDirectionCosines()->Print(std::cout);
transform->Concatenate(invert.front());
//axes2->SetShaftTypeToCylinder();
axes2->SetUserTransform( transform );
cube->GetAssembly()->SetUserTransform( transform ); // cant get it to work
vtkSmartPointer< vtkPropAssembly > assembly = vtkSmartPointer< vtkPropAssembly >::New();
assembly->AddPart( axes2 );
assembly->AddPart( cube );
vtkSmartPointer< vtkOrientationMarkerWidget > widget = vtkSmartPointer< vtkOrientationMarkerWidget >::New();
widget->SetOrientationMarker( assembly );
widget->SetInteractor( iren );
widget->SetEnabled( 1 );
widget->InteractiveOff();
widget->InteractiveOn();
renwin->Render();
iren->Start();
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment