[ITK-users] ITK and VNL - SVD decomposition of image - Seg fault

Tejas tejas.rox at gmail.com
Sat Nov 22 20:04:31 EST 2014


Hi, 

I am trying to decompose my affine-registered input ITK image using the SVD
routine in VNL. I have followed prior source code available from the
following links: 

http://www.itk.org/pipermail/insight-users/2014-July/050694.html
http://public.kitware.com/vxl/doc/development/books/core/book_6.html
http://public.kitware.com/pipermail/insight-users/2007-February/020883.html

A part of my code, which is the root cause of the two problems below, is
pasted after a short explanation of what I am facing: 

There are two problems that occur:

Problem 1: 
While using the standard VNL SVD routine (vnl_svd) to decompose my input
image into the singular matrix (W) and two orthogonal matrices (U and V), I
witness segmentation faults when running my code from the command prompt.
This is similar to what one user had posted in the first link above.
Elaborating further:

My code seg faults when I use this line: vnl_svd<double> svd(VNLMatrix);
Yet, it runs fine when I use this line instead: vnl_svd<double>
svdTranspose(VNLMatrix.transpose());

Is there an inherent issue with the vnl_svd routine that has not been fixed
yet? If so, what are the other possible ways to run svd on a single 200x200
image? 

Problem 2: 
Recomposing the U,W,and V component matrices yields an abnormal result. The
recomposition of the matrices is returned as a vnl_matrix of a specific data
type; in my case, a double valued matrix. When visualizing the resulting
.MHA file in ITK-SNAP, the image appears all white. At first, I thought I
was seeing a scaled intensity of the image. So, I divided the image by it's
maximum value, and the result was pretty much the same, so scaling wasn't
the issue here. I believe that problem 2 is connected to problem 1, and I am
not sure about how to solve problem 1 itself. Does anybody have thoughts on
why this is the case? 


Code: 
        
        typedef itk::VariableSizeMatrix< double > MatrixType;        

	// create a matrix structure in ITK  
	MatrixType matrix;
        matrix.SetSize(rows, cols);		// set the size of the ITK matrix

	// create an image iterator
        // dAlignedIm is a double data-type, ITK affine-registered image
passed to vnl_svd, via an ITK VariableSizeMatrix and vnl_matrix. 

	IterType inputIter( dAlignedIm, dAlignedIm->GetLargestPossibleRegion() );
        inputIter.GoToBegin();

	while(!inputIter.IsAtEnd()) {

		// copy the input image intensity value into the corresponding matrix
		unsigned int c = inputIter.GetIndex()[0];
		unsigned int r = inputIter.GetIndex()[1];
		matrix(r, c) = inputIter.Get();
		++inputIter;
	}

	

	// create a vnl matrix 
	vnl_matrix< double > VNLMatrix = matrix.GetVnlMatrix();

	//// perform SVD decomposition
	vnl_svd<double> svdTranspose(VNLMatrix.transpose());

	//svdTranspose.recompose();
	//svdTranspose.W(0,0) = 0; 	 


	typedef itk::ImportImageFilter< double, Dimension >   ImportFilterType;

	ImportFilterType::Pointer importFilter = ImportFilterType::New();

	ImportFilterType::SizeType  size;
	size[0]  = cols;  // size along X
	size[1]  = rows;  // size along Y	

	ImportFilterType::IndexType start;
	start.Fill( 0 );

	ImportFilterType::RegionType region;
	region.SetIndex( start );
	region.SetSize(  size  );

	importFilter->SetRegion( region );

	double origin[ Dimension ];
	origin[0] = 0.0;    // X coordinate
	origin[1] = 0.0;    // Y coordinate

	importFilter->SetOrigin( origin );

	double spacing[ Dimension ];
	spacing[0] = 1.0;    // along X direction
	spacing[1] = 1.0;    // along Y direction

	importFilter->SetSpacing( spacing );
	
	const bool importImageFilterWillOwnTheBuffer = false;

	vnl_matrix <double> reconstruct = (svdTranspose.recompose());
	//reconstruct = reconstruct.transpose();
	
	importFilter->SetImportPointer( reconstruct.data_block(), rows*cols,
importImageFilterWillOwnTheBuffer );
	

	typedef itk::ImageFileWriter< doubleImageType >  WriterType2;
	//typedef itk::CastImageFilter<	doubleImageType,	ImageType >
CastFilterType3;

	WriterType2::Pointer writernew = WriterType2::New();
	//CastFilterType3::Pointer casternew = CastFilterType3::New();
	writernew->SetFileName( "reconstruct.mha" );
		
	//casternew->SetInput( importFilter->GetOutput() );
	writernew->SetInput(  importFilter->GetOutput()  );
	


	try
	{
		writernew->Update();
	}
		catch( itk::ExceptionObject & exp )
	{
		std::cerr << "Exception caught !" << std::endl;
		std::cerr << exp << std::endl;
	}



--
View this message in context: http://itk-insight-users.2283740.n2.nabble.com/ITK-and-VNL-SVD-decomposition-of-image-Seg-fault-tp7586604.html
Sent from the ITK Insight Users mailing list archive at Nabble.com.


More information about the Insight-users mailing list