[ITK-users] Convert 2D itkImage to vnl_matrix
Matt McCormick
matt.mccormick at kitware.com
Mon May 4 14:25:39 EDT 2015
Hi Marco,
Make sure to call
extractor->UpdateLargestPossibleRegion();
before trying to examine its output.
HTH,
Matt
On Wed, Apr 29, 2015 at 8:46 AM, Marco Ulgelmo <marco.ulge at gmail.com> wrote:
> Hello,
>
> I was trying to get a matrix out of a 2D image as i need to perform
> particular calculations. At first i open a 3D image and using
> ExtractImageFilter i extract the 2D image collapsing the 3rd dimension.
> There must be something wrong in the code as every time i try to perform any
> kind of operation on the newly created matrix i get a segfault. It might be
> really stupid but i haven't been able to spot it.
>
> Code:
>
> typedef float OutputPixelType;
>
> typedef itk::Image< OutputPixelType, 4 > InputImageType;
> typedef itk::Image< OutputPixelType, 3 > OutputImageType;
> typedef itk::Image< OutputPixelType, 2 > BidimensionalImageType;
>
> typedef itk::ImageFileReader< InputImageType > ReaderType;
> typedef itk::ImageFileReader< OutputImageType > OutputReaderType;
> typedef itk::ImageFileWriter< OutputImageType > WriterType;
>
> //mediaFilePath is the path to a 3D image (mha extension)
>
> char* MediaFileName = (char*)mediaFilePath.c_str();
>
> OutputReaderType::Pointer reader = OutputReaderType::New();
> reader->SetFileName(MediaFileName);
> reader->Update();
>
> typedef itk::ExtractImageFilter< OutputImageType, BidimensionalImageType
>> BidimensionalExtractorType;
>
> BidimensionalExtractorType::Pointer extractor =
> BidimensionalExtractorType::New();
>
> extractor->InPlaceOn();
> extractor->SetDirectionCollapseToSubmatrix();
> try{
> reader->UpdateOutputInformation();
> }
> catch ( itk::ExceptionObject & exp ){
> return 0;// "Couldn't read selected Subject, format not supported.";
> }
>
> OutputImageType::RegionType inputRegion3 =
> reader->GetOutput()->GetLargestPossibleRegion();
> OutputImageType::SizeType size3 = inputRegion3.GetSize();
> size3[2] = 0;
>
> OutputImageType::IndexType start3 = inputRegion3.GetIndex();
> start3[2] = 0;
> OutputImageType::RegionType desiredRegion3;
> desiredRegion3.SetSize( size3 );
> desiredRegion3.SetIndex( start3 );
>
> extractor->SetExtractionRegion( desiredRegion3 );
>
> extractor->SetInput( reader->GetOutput() );
> //writer->SetInput( extractor->GetOutput() );
>
> int width =
> reader->GetOutput()->GetLargestPossibleRegion().GetSize()[0];
> int height =
> reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1];
>
> const unsigned int rows = height;
> const unsigned int cols = width;
>
> typedef vnl_matrix_ref< OutputPixelType > MatrixType;
>
> BidimensionalImageType::Pointer image = extractor->GetOutput();
>
> MatrixType matrix( rows, cols, image->GetBufferPointer());
>
> matrix.data_array();
>
> std::cout << matrix[1][1] << std::endl;
>
> Thanks,
> Marco
>
> _____________________________________
> 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:
> http://public.kitware.com/mailman/listinfo/insight-users
>
More information about the Insight-users
mailing list