EigenDecomposition3d
Performs the singular value decomposition (SVD) of a 3D tensor field image.
Access to parameter description
This algorithm creates one or several output images containing the eigenvectors and/or eigenvalues of the input matrix image $I$ (or 3D tensor field). The input image must have six channels, where each channel contains one of the unique components of a 3x3 symmetric matrix. The redundant components are not contained in the input image.
Let $A(P)$ be the 3x3 symmetric matrix at position $P=(x,y,z)$.
The input image $I$ has 6 spectral component values $s$ at the spatial position $P$:
See also
Access to parameter description
This algorithm creates one or several output images containing the eigenvectors and/or eigenvalues of the input matrix image $I$ (or 3D tensor field). The input image must have six channels, where each channel contains one of the unique components of a 3x3 symmetric matrix. The redundant components are not contained in the input image.
Let $A(P)$ be the 3x3 symmetric matrix at position $P=(x,y,z)$.
The input image $I$ has 6 spectral component values $s$ at the spatial position $P$:
- $I(P,0)=A(P)_{1,1}$
- $I(P,1)=A(P)_{1,2}$
- $I(P,2)=A(P)_{1,3}$
- $I(P,3)=A(P)_{2,2}$
- $I(P,4)=A(P)_{2,3}$
- $I(P,5)=A(P)_{3,3}$
See also
Function Syntax
This function returns a EigenDecomposition3dOutput structure containing the outputVectorImage1, outputVectorImage2, outputVectorImage3 and outputEigenvaluesImage output parameters.
// Output structure. struct EigenDecomposition3dOutput { std::shared_ptr< iolink::ImageView > outputVectorImage1; std::shared_ptr< iolink::ImageView > outputVectorImage2; std::shared_ptr< iolink::ImageView > outputVectorImage3; std::shared_ptr< iolink::ImageView > outputEigenvaluesImage; }; // Function prototype. EigenDecomposition3dOutput eigenDecomposition3d( std::shared_ptr< iolink::ImageView > inputTensorImage, int32_t outputSelection, std::shared_ptr< iolink::ImageView > outputVectorImage1 = NULL, std::shared_ptr< iolink::ImageView > outputVectorImage2 = NULL, std::shared_ptr< iolink::ImageView > outputVectorImage3 = NULL, std::shared_ptr< iolink::ImageView > outputEigenvaluesImage = NULL );
This function returns a tuple containing the output_vector_image1, output_vector_image2, output_vector_image3 and output_eigenvalues_image output parameters.
// Function prototype. eigen_decomposition_3d( input_tensor_image, output_selection = 11, output_vector_image1 = None, output_vector_image2 = None, output_vector_image3 = None, output_eigenvalues_image = None )
This function returns a EigenDecomposition3dOutput structure containing the outputVectorImage1, outputVectorImage2, outputVectorImage3 and outputEigenvaluesImage output parameters.
/// Output structure of the EigenDecomposition3d function. public struct EigenDecomposition3dOutput { public IOLink.ImageView outputVectorImage1; public IOLink.ImageView outputVectorImage2; public IOLink.ImageView outputVectorImage3; public IOLink.ImageView outputEigenvaluesImage; }; // Function prototype. public static EigenDecomposition3dOutput EigenDecomposition3d( IOLink.ImageView inputTensorImage, Int32 outputSelection = 11, IOLink.ImageView outputVectorImage1 = null, IOLink.ImageView outputVectorImage2 = null, IOLink.ImageView outputVectorImage3 = null, IOLink.ImageView outputEigenvaluesImage = null );
Class Syntax
Parameters
Class Name | EigenDecomposition3d |
---|
Parameter Name | Description | Type | Supported Values | Default Value | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
inputTensorImage |
The input image of which each voxel represents a 3x3 symmetric matrix. This image must have the float data type and contain 6 channels.
The 6 channels must be in the following order: $(A_{11}, A_{12}, A_{13}, A_{22}, A_{23}, A_{33})$ where $A$ is a symmetric 3x3 matrix (or 3D tensor). |
Image | Binary, Label or Multispectral | nullptr | |||||||||
outputSelection |
The output images to be computed. Several outputs can be generated by combining the associated enumerated values.
|
MultipleChoice | EIGEN_VECTOR_1 | EIGEN_VECTOR_2 | EIGEN_VALUES | ||||||||||
outputVectorImage1 |
The first eigenvector output image containing the largest eigenvalue.
The X, Y and Z dimensions of this output image are the same as the input but the number of channels is three (channel 0: X component, channel 1: Y component, channel 2: Z component). The calibration (voxel size, origin, orientation) is the same as the input image. The output data type is forced to float. |
Image | nullptr | ||||||||||
outputVectorImage2 |
The second eigenvector image containing the medium eigenvalue.
The X, Y and Z dimensions of this output image are the same as the input but the number of channels is three (channel 0: X component, channel 1: Y component, channel 2: Z component). The calibration (voxel size, origin, orientation) is the same as the input image. The output data type is forced to float. |
Image | nullptr | ||||||||||
outputVectorImage3 |
The third eigenvector image containing the smallest eigenvalue.
The X, Y and Z dimensions of this output image are the same as the input but the number of channels is three (channel 0: X component, channel 1: Y component, channel 2: Z component). The calibration (voxel size, origin, orientation) is the same as the input image. The output data type is forced to float. |
Image | nullptr | ||||||||||
outputEigenvaluesImage |
The eigenvalues output image. Each channel corresponds to an eigenvalue, from the largest to the smallest.
The X, Y and Z dimensions of this output image are the same as the input but the number of channels is three (channel 0: largest eigenvalue, channel 1: medium eigenvalue, channel 2: smallest eigenvalue). The calibration (voxel size, origin, orientation) is the same values as the input image. The output data type is forced to float. |
Image | nullptr |
Object Examples
auto neuron_hessian = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "neuron_hessian.vip" ); EigenDecomposition3d eigenDecomposition3dAlgo; eigenDecomposition3dAlgo.setInputTensorImage( neuron_hessian ); eigenDecomposition3dAlgo.setOutputSelection( 15 ); eigenDecomposition3dAlgo.execute(); std::cout << "outputVectorImage1:" << eigenDecomposition3dAlgo.outputVectorImage1()->toString(); std::cout << "outputVectorImage2:" << eigenDecomposition3dAlgo.outputVectorImage2()->toString(); std::cout << "outputVectorImage3:" << eigenDecomposition3dAlgo.outputVectorImage3()->toString(); std::cout << "outputEigenvaluesImage:" << eigenDecomposition3dAlgo.outputEigenvaluesImage()->toString();
neuron_hessian = imagedev.read_vip_image(imagedev_data.get_image_path("neuron_hessian.vip")) eigen_decomposition_3d_algo = imagedev.EigenDecomposition3d() eigen_decomposition_3d_algo.input_tensor_image = neuron_hessian eigen_decomposition_3d_algo.output_selection = 15 eigen_decomposition_3d_algo.execute() print( "output_vector_image1:", str( eigen_decomposition_3d_algo.output_vector_image1 ) ); print( "output_vector_image2:", str( eigen_decomposition_3d_algo.output_vector_image2 ) ); print( "output_vector_image3:", str( eigen_decomposition_3d_algo.output_vector_image3 ) ); print( "output_eigenvalues_image:", str( eigen_decomposition_3d_algo.output_eigenvalues_image ) );
ImageView neuron_hessian = Data.ReadVipImage( @"Data/images/neuron_hessian.vip" ); EigenDecomposition3d eigenDecomposition3dAlgo = new EigenDecomposition3d { inputTensorImage = neuron_hessian, outputSelection = 15 }; eigenDecomposition3dAlgo.Execute(); Console.WriteLine( "outputVectorImage1:" + eigenDecomposition3dAlgo.outputVectorImage1.ToString() ); Console.WriteLine( "outputVectorImage2:" + eigenDecomposition3dAlgo.outputVectorImage2.ToString() ); Console.WriteLine( "outputVectorImage3:" + eigenDecomposition3dAlgo.outputVectorImage3.ToString() ); Console.WriteLine( "outputEigenvaluesImage:" + eigenDecomposition3dAlgo.outputEigenvaluesImage.ToString() );
Function Examples
auto neuron_hessian = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "neuron_hessian.vip" ); auto result = eigenDecomposition3d( neuron_hessian, 15 ); std::cout << "outputVectorImage1:" << result.outputVectorImage1->toString(); std::cout << "outputVectorImage2:" << result.outputVectorImage2->toString(); std::cout << "outputVectorImage3:" << result.outputVectorImage3->toString(); std::cout << "outputEigenvaluesImage:" << result.outputEigenvaluesImage->toString();
neuron_hessian = imagedev.read_vip_image(imagedev_data.get_image_path("neuron_hessian.vip")) result_output_vector_image1, result_output_vector_image2, result_output_vector_image3, result_output_eigenvalues_image = imagedev.eigen_decomposition_3d( neuron_hessian, 15 ) print( "output_vector_image1:", str( result_output_vector_image1 ) ); print( "output_vector_image2:", str( result_output_vector_image2 ) ); print( "output_vector_image3:", str( result_output_vector_image3 ) ); print( "output_eigenvalues_image:", str( result_output_eigenvalues_image ) );
ImageView neuron_hessian = Data.ReadVipImage( @"Data/images/neuron_hessian.vip" ); Processing.EigenDecomposition3dOutput result = Processing.EigenDecomposition3d( neuron_hessian, 15 ); Console.WriteLine( "outputVectorImage1:" + result.outputVectorImage1.ToString() ); Console.WriteLine( "outputVectorImage2:" + result.outputVectorImage2.ToString() ); Console.WriteLine( "outputVectorImage3:" + result.outputVectorImage3.ToString() ); Console.WriteLine( "outputEigenvaluesImage:" + result.outputEigenvaluesImage.ToString() );