[Insight-users] EigenVector Computation
Sundaresan R
sundaresan.r at gmail.com
Wed Feb 23 09:40:22 EST 2011
Hi Kana,
Yes, you are right, the dimension not being set was causing the problem.
Thank you very much.
Sundar
On Wed, Feb 23, 2011 at 4:05 AM, Arunachalam Kana <
Kana.Arunachalam at fh-wels.at> wrote:
> Hi Sundar,
>
>
>
> I use the eigenvalue analysis too. So i cross verified with my code whether
> you were missing something. My code is:
>
>
>
> typedef itk::SymmetricEigenAnalysis <
> HessianRecursiveGaussianFilterType::OutputImageType::PixelType,
> VectorPixelType, EV_PixelType > EigAnalysisType;
>
> //set eigen analysis
>
> EigAnalysisType eig;
>
> eig.SetDimension( 3 );
>
> eig.SetOrderEigenMagnitudes( true );
>
>
>
> I found that the input matrix dimension was not set. Please check whether
> this is causing the error.
>
> All the best.
>
> Kana
>
>
>
> *From:* insight-users-bounces at itk.org [mailto:
> insight-users-bounces at itk.org] *On Behalf Of *Sundaresan R
> *Sent:* 22 February 2011 22:58
> *To:* insight-users at itk.org
> *Subject:* [Insight-users] EigenVector Computation
>
>
>
> Hi
>
> I'm computing the Hessians and then use SymmetricEigenAnalysis to compute
> the eigenVectors as follows:
> I get a segmentation fault at the call to ComputeEigenValuesAndVectors
> method. Can anyone help me fix this issue?
>
> Thanks,
> Sundar
>
>
> **************************************************************************************
>
> #include "itkHessianRecursiveGaussianImageFilter.h"
> #include "itkSymmetricEigenAnalysis.h"
> #include "itkSymmetricEigenAnalysisImageFilter.h"
> #include "itkSymmetricSecondRankTensor.h"
> #include "itkCastImageFilter.h"
> #include "itkImage.h"
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
> #include <iostream>
>
>
> const unsigned int Dimension = 3;
> typedef double InputPixelType;
> typedef double OutputPixelType;
> typedef itk::Image< InputPixelType, Dimension > InputImageType;
> typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
> typedef itk::ImageFileReader< InputImageType > ReaderType;
> typedef itk::ImageFileWriter< OutputImageType > WriterType;
> typedef itk::HessianRecursiveGaussianImageFilter< InputImageType >
> HessianFilterType;
> typedef itk::Vector< InputPixelType, Dimension > VectorType;
> typedef itk::Image< VectorType, Dimension > VectorImageType;
> typedef itk::Matrix< InputPixelType, Dimension, Dimension > MatrixType;
> typedef itk::Image< MatrixType, Dimension > MatrixImageType;
> typedef itk::ImageRegionConstIterator< MatrixImageType >
> MatrixIteratorType;
> typedef itk::ImageRegionIterator< MatrixImageType > OutputIteratorType;
> typedef itk::SymmetricEigenAnalysis< MatrixType, VectorType, MatrixType >
> EigenVectorAnalysisType;
> typedef MatrixImageType::Pointer MatrixImagePointer;
> typedef MatrixImageType::RegionType RegionType;
> typedef MatrixImageType::PointType PointType;
> typedef MatrixImageType::SpacingType SpacingType;
> typedef
> itk::ImageRegionIteratorWithIndex<HessianFilterType::OutputImageType>
> HessianIteratorType;
> typedef itk::ImageFileWriter< MatrixImageType > MatrixWriterType;
>
> int main( int argc, char *argv[] )
> {
> if( argc < 3 )
> {
> std::cerr << "Usage: ./" << argv[0] << " inputImage sigma" <<
> std::endl;
> }
>
> ReaderType::Pointer reader = ReaderType::New();
> reader->SetFileName( argv[1] );
>
> HessianFilterType::Pointer hessianFilter = HessianFilterType::New();
> hessianFilter->SetInput( reader->GetOutput() );
> if( argc >= 3 )
> hessianFilter->SetSigma( static_cast< double >( atof(argv[2])) );
> std::cout << "Calculating Hessian matrix" << std::endl;
> hessianFilter->Update();
> std::cout << "Done" << std::endl;
>
> EigenVectorAnalysisType evap;
> HessianFilterType::OutputImageType::Pointer input =
> hessianFilter->GetOutput();
> RegionType region = input->GetLargestPossibleRegion();
> SpacingType spacing = input->GetSpacing();
> PointType origin = input->GetOrigin();
>
> MatrixType eigenMatrix, myMatrix;
> eigenMatrix[0][0] = 0; eigenMatrix[0][1]=0;eigenMatrix[0][2]=0;
> eigenMatrix[1][0] = 0; eigenMatrix[1][1]=0;eigenMatrix[1][2]=0;
> eigenMatrix[2][0] = 0; eigenMatrix[2][1]=0;eigenMatrix[2][2]=0;
>
> // Allocate the output image
> MatrixImagePointer m_Output = MatrixImageType::New();
> m_Output->SetRegions( region );
> m_Output->SetOrigin( origin );
> m_Output->SetSpacing( spacing );
> m_Output->Allocate();
> m_Output->FillBuffer( eigenMatrix );
>
> VectorType eigenVal;
> eigenVal[0]=eigenVal[1]=eigenVal[2]=0;
> HessianIteratorType mIt( input, region );
> OutputIteratorType oIt( m_Output, region );
> itk::SymmetricSecondRankTensor<double, 3> myTensor;
> mIt.GoToBegin();
> oIt.GoToBegin();
> while( !mIt.IsAtEnd() )
> {
> // Compute eigen values and eigen matrix
> evap.SetOrderEigenValues( 1 );
> myTensor = mIt.Get();
> myMatrix[0][0] = myTensor[0];
> myMatrix[0][1] = myTensor[1];
> myMatrix[0][2] = myTensor[2];
> myMatrix[1][0] = myTensor[1];
> myMatrix[1][1] = myTensor[3];
> myMatrix[1][2] = myTensor[4];
> myMatrix[2][0] = myTensor[2];
> myMatrix[2][1] = myTensor[4];
> myMatrix[2][2] = myTensor[5];
> std::cout << "myTensor " << myTensor << std::endl;
> std::cout << "myMatrix " << myMatrix << std::endl;
> std::cout << "eigenVal " << eigenVal << std::endl;
> std::cout << "eigenMatrix " << eigenMatrix << std::endl;
> evap.ComputeEigenValuesAndVectors( myMatrix, eigenVal, eigenMatrix );
> std::cout << " After ComputeEigenValuesAndVectors" << std::endl;
> oIt.Set( eigenMatrix );
> ++oIt;
> ++mIt;
> }
> MatrixWriterType::Pointer writer = MatrixWriterType::New();
> writer->SetInput( m_Output );
> writer->SetFileName( "EigenMatrix.mhd" );
> try
> {
> writer->Update();
> }
> catch ( itk::ExceptionObject e )
> {
> std::cerr << "Error: " << e << std::endl;
> }
> return EXIT_SUCCESS;
> }
>
> ***************************************************************************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20110223/f74c5124/attachment-0001.htm>
More information about the Insight-users
mailing list