EigenDecomposition2d
            Performs the singular value decomposition (SVD) of a 2D 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 2D tensor field). The input image must have three channels, where each channel contains one of the unique components of a 2x2 symmetric matrix. The redundant components are not contained in the input image.
Let $A(P)$ be the 2x2 symmetric matrix at position $P=(x,y)$.
The input image $I$ has three 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 2D tensor field). The input image must have three channels, where each channel contains one of the unique components of a 2x2 symmetric matrix. The redundant components are not contained in the input image.
Let $A(P)$ be the 2x2 symmetric matrix at position $P=(x,y)$.
The input image $I$ has three 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)_{2,2}$
 
See also
Function Syntax
This function returns a EigenDecomposition2dOutput structure containing the outputVectorImage1, outputVectorImage2 and outputEigenvaluesImage output parameters.
                        
                    
// Output structure.
struct EigenDecomposition2dOutput
{
    std::shared_ptr< iolink::ImageView > outputVectorImage1;
    std::shared_ptr< iolink::ImageView > outputVectorImage2;
    std::shared_ptr< iolink::ImageView > outputEigenvaluesImage;
};
// Function prototype.
EigenDecomposition2dOutput
eigenDecomposition2d( 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 > outputEigenvaluesImage = NULL );
                    
This function returns a tuple containing the output_vector_image1, output_vector_image2 and output_eigenvalues_image output parameters.
                        
                    
// Function prototype.
eigen_decomposition_2d( input_tensor_image,
                        output_selection = 5,
                        output_vector_image1 = None,
                        output_vector_image2 = None,
                        output_eigenvalues_image = None )
                    
This function returns a EigenDecomposition2dOutput structure containing the outputVectorImage1, outputVectorImage2 and outputEigenvaluesImage output parameters.
                        
                
/// Output structure of the EigenDecomposition2d function.
public struct EigenDecomposition2dOutput
{
    public IOLink.ImageView outputVectorImage1;
    public IOLink.ImageView outputVectorImage2;
    public IOLink.ImageView outputEigenvaluesImage;
};
// Function prototype.
public static EigenDecomposition2dOutput
EigenDecomposition2d( IOLink.ImageView inputTensorImage,
                      Int32 outputSelection = 5,
                      IOLink.ImageView outputVectorImage1 = null,
                      IOLink.ImageView outputVectorImage2 = null,
                      IOLink.ImageView outputEigenvaluesImage = null );
                    Class Syntax
Parameters
| Class Name | EigenDecomposition2d | 
|---|
| Parameter Name | Description | Type | Supported Values | Default Value | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
![]()  | 
  inputTensorImage    | 
 The input image of which each pixel represents a 2x2 symmetric matrix. This image must have the float data type and contain three channels.
 The three channels must be in the following order: $(A_{11}, A_{12}, A_{22})$ where $A$ is a symmetric 2x2 matrix (or 2D 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_VALUES | |||||||
![]()  | 
  outputVectorImage1    | 
 The first eigenvector output image containing the largest eigenvalue.
 The X and Y dimensions of this output image are the same as the input but the number of channels is two (channel 0: X component, channel 1: Y 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 output image containing the smallest eigenvalue.
 The X and Y dimensions of this output image are the same as the input but the number of channels is two (channel 0: X component, channel 1: Y 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 and Y dimensions of this output image are the same as the input but the number of channels is two (channel 0: largest eigenvalue, channel 1: 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 retina_hessian = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "retina_hessian.vip" ); EigenDecomposition2d eigenDecomposition2dAlgo; eigenDecomposition2dAlgo.setInputTensorImage( retina_hessian ); eigenDecomposition2dAlgo.setOutputSelection( 7 ); eigenDecomposition2dAlgo.execute(); std::cout << "outputVectorImage1:" << eigenDecomposition2dAlgo.outputVectorImage1()->toString(); std::cout << "outputVectorImage2:" << eigenDecomposition2dAlgo.outputVectorImage2()->toString(); std::cout << "outputEigenvaluesImage:" << eigenDecomposition2dAlgo.outputEigenvaluesImage()->toString();
retina_hessian = imagedev.read_vip_image(imagedev_data.get_image_path("retina_hessian.vip"))
eigen_decomposition_2d_algo = imagedev.EigenDecomposition2d()
eigen_decomposition_2d_algo.input_tensor_image = retina_hessian
eigen_decomposition_2d_algo.output_selection = 7
eigen_decomposition_2d_algo.execute()
print( "output_vector_image1:", str( eigen_decomposition_2d_algo.output_vector_image1 ) );
print( "output_vector_image2:", str( eigen_decomposition_2d_algo.output_vector_image2 ) );
print( "output_eigenvalues_image:", str( eigen_decomposition_2d_algo.output_eigenvalues_image ) );
            
ImageView retina_hessian = Data.ReadVipImage( @"Data/images/retina_hessian.vip" );
EigenDecomposition2d eigenDecomposition2dAlgo = new EigenDecomposition2d
{
    inputTensorImage = retina_hessian,
    outputSelection = 7
};
eigenDecomposition2dAlgo.Execute();
Console.WriteLine( "outputVectorImage1:" + eigenDecomposition2dAlgo.outputVectorImage1.ToString() );
Console.WriteLine( "outputVectorImage2:" + eigenDecomposition2dAlgo.outputVectorImage2.ToString() );
Console.WriteLine( "outputEigenvaluesImage:" + eigenDecomposition2dAlgo.outputEigenvaluesImage.ToString() );
            Function Examples
auto retina_hessian = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "retina_hessian.vip" ); auto result = eigenDecomposition2d( retina_hessian, 7 ); std::cout << "outputVectorImage1:" << result.outputVectorImage1->toString(); std::cout << "outputVectorImage2:" << result.outputVectorImage2->toString(); std::cout << "outputEigenvaluesImage:" << result.outputEigenvaluesImage->toString();
retina_hessian = imagedev.read_vip_image(imagedev_data.get_image_path("retina_hessian.vip"))
result_output_vector_image1, result_output_vector_image2, result_output_eigenvalues_image = imagedev.eigen_decomposition_2d( retina_hessian, 7 )
print( "output_vector_image1:", str( result_output_vector_image1 ) );
print( "output_vector_image2:", str( result_output_vector_image2 ) );
print( "output_eigenvalues_image:", str( result_output_eigenvalues_image ) );
            ImageView retina_hessian = Data.ReadVipImage( @"Data/images/retina_hessian.vip" ); Processing.EigenDecomposition2dOutput result = Processing.EigenDecomposition2d( retina_hessian, 7 ); Console.WriteLine( "outputVectorImage1:" + result.outputVectorImage1.ToString() ); Console.WriteLine( "outputVectorImage2:" + result.outputVectorImage2.ToString() ); Console.WriteLine( "outputEigenvaluesImage:" + result.outputEigenvaluesImage.ToString() );

