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

Tejas tejas.rox at gmail.com
Tue Nov 25 20:09:27 EST 2014


I have created a temporary solution to my problem by using the SVD routine
available in OpenCV. 
I did not have the OpenCV bridge module in ITK built, so I had to
incorporate the relevant header files (core.hpp, imgproc.hpp, gpu.hpp,
highgui.hpp etc.) into my project, and link to the appropriate
configuration-specific OpenCV libraries as well. After completing my image
analysis operation, I used the ITK import image filter to import my OpenCV
data back into ITK. 

My hope is that this fix will help someone in the future whenever they
stumble across the same problem I had faced while using vnl_svd. 

The code is as follows: 

        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
	IterType inputIter( dAlignedIm, dAlignedIm->GetLargestPossibleRegion() );
        inputIter.GoToBegin();

	// copy the BRATS image to openCV
	while(!inputIter.IsAtEnd()) {

		// copy the input image intensity value into the corresponding matrix
		matrix(inputIter.GetIndex()[1], inputIter.GetIndex()[0]) =
inputIter.Get();
		
		cv_brats.at<double>(inputIter.GetIndex()[1], inputIter.GetIndex()[0]) =
matrix(inputIter.GetIndex()[1], inputIter.GetIndex()[0]); 
		++inputIter;
	}

	Mat U, S, Vt; 
	
	// compute svd of Brats image 
	SVD::compute(cv_brats, S, U, Vt); 

        // .............
        // Do whatever you want with the singular values and orthonormal
matrices.
        // I used it for reconstruction, so I will get back an OpenCV mat
structure called 'reconstruct'. 

        // IMPORT OpenCV MAT INTO ITK 	

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

	// set size of the image
	ImportFilterType::SizeType  size;
	size[0]  = reconstruct.cols;  // size along X
	size[1]  = reconstruct.rows;  // size along Y

	// set starting index of image - top left
	ImportFilterType::IndexType start;
	start.Fill( 0 );

	// set region of the image
	ImportFilterType::RegionType region;
	region.SetIndex( start );
	region.SetSize(  size  );
	
	importFilter->SetRegion( region );

	// set spacing of image
	double spacing[ Dimension ];
	spacing[0] = 1.0;    // along X direction
	spacing[1] = 1.0;    // along Y direction
	
	importFilter->SetSpacing( spacing );

	// set origin of output image
	double origin[ Dimension ];
	origin[0] = 0.0;    // X coordinate
	origin[1] = 0.0;    // Y coordinate

	importFilter->SetOrigin( origin );

	// allocate CPU image buffer after specifying size of image
	const unsigned int numberOfPixels =  size[0] * size[1];
	double * localBuffer = new double[ numberOfPixels ];

	// reconstruct.data is an (unsigned char*) type
	// reinterpret cast it into the (double*) type, which is used by the local
buffer
	localBuffer = reinterpret_cast<double *> (reconstruct.data);

	// now, import the local image data
	const bool importImageFilterWillOwnTheBuffer = false;
	importFilter->SetImportPointer( localBuffer, numberOfPixels,
importImageFilterWillOwnTheBuffer );

	// pass data from the imported image to the new ITK image
	doubleImageType::Pointer newIm = importFilter->GetOutput();      





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


More information about the Insight-users mailing list