EigenvaluesToStructureness2d
Computes a structure score image from the eigenvalues of a two-dimensional tensor image.
Access to parameter description
This algorithm allows extracting tubular or blob-like structures from dark or bright background.
The computation is based on eigenvalues $\lambda_{1}$ and $\lambda_{2}$ where $\mid \lambda_{1} \mid \geq \mid \lambda_{2} \mid $.
The structure score for bright tubular structures corresponds to:
$score = \left\{ \begin{array}{l l} 0 & \quad \text{if $\lambda_{1} > 0$, }\\ exp(- \frac{ \big( \frac{\lambda_{2}}{\lambda_{1}} \big) ^{2} }{2 \beta^{2} } ) \big(1-exp \big(- \frac{S^{2}}{2c^{2}} \big) \big) \\ \end{array} \right.$
The score for bright blob-like structures is computed as follows:
$ score = \left\{ \begin{array}{l l} 0 & \quad \text{if $\lambda_{1} > 0$ or $\lambda_{2} > 0$, }\\ \big(1-exp(- \frac{ \big( \frac{\lambda_{2}}{\lambda_{1}} \big) ^{2} }{2 \beta^{2} } )\big) \big(1-exp \big(- \frac{S^{2}}{2c^{2}} \big) \big) \\ \end{array} \right.$
Where:
This algorithm outputs a float grayscale image where each pixel intensity represents a structure score between 0 and 1.
The method for tubular structures is referenced by Alejandro Frangi publication:
A.F.Frangi, W.J.Niessen, K.L.Vincken, M.A.Viergever. "Multiscale vessel enhancement filtering". Lecture Notes in Computer Science(MICCAI), vol. 1496, pp. 130-137, 1998.
See also
Access to parameter description
This algorithm allows extracting tubular or blob-like structures from dark or bright background.
The computation is based on eigenvalues $\lambda_{1}$ and $\lambda_{2}$ where $\mid \lambda_{1} \mid \geq \mid \lambda_{2} \mid $.
The structure score for bright tubular structures corresponds to:
$score = \left\{ \begin{array}{l l} 0 & \quad \text{if $\lambda_{1} > 0$, }\\ exp(- \frac{ \big( \frac{\lambda_{2}}{\lambda_{1}} \big) ^{2} }{2 \beta^{2} } ) \big(1-exp \big(- \frac{S^{2}}{2c^{2}} \big) \big) \\ \end{array} \right.$
The score for bright blob-like structures is computed as follows:
$ score = \left\{ \begin{array}{l l} 0 & \quad \text{if $\lambda_{1} > 0$ or $\lambda_{2} > 0$, }\\ \big(1-exp(- \frac{ \big( \frac{\lambda_{2}}{\lambda_{1}} \big) ^{2} }{2 \beta^{2} } )\big) \big(1-exp \big(- \frac{S^{2}}{2c^{2}} \big) \big) \\ \end{array} \right.$
Where:
- $S$ is the Hessian norm $S = \sqrt{\lambda_{1}^{2}\lambda_{2}^{2}}$
- $\beta$ is a threshold which controls the blobness sensitivity,
- c is a sensitivity threshold wich controls the noise influence. $c = noiseCutoff \cdot S_{max}$ with $S_{max}$ the maximum Hessian norm in the image.
This algorithm outputs a float grayscale image where each pixel intensity represents a structure score between 0 and 1.
The method for tubular structures is referenced by Alejandro Frangi publication:
A.F.Frangi, W.J.Niessen, K.L.Vincken, M.A.Viergever. "Multiscale vessel enhancement filtering". Lecture Notes in Computer Science(MICCAI), vol. 1496, pp. 130-137, 1998.
See also
Function Syntax
This function returns outputImage.
// Function prototype
std::shared_ptr< iolink::ImageView > eigenvaluesToStructureness2d( std::shared_ptr< iolink::ImageView > inputEigenvaluesImage, EigenvaluesToStructureness2d::Lightness lightness, EigenvaluesToStructureness2d::StructureType structureType, double beta, double noiseCutoff, std::shared_ptr< iolink::ImageView > outputImage = NULL );
This function returns outputImage.
// Function prototype. eigenvalues_to_structureness_2d( input_eigenvalues_image, lightness = EigenvaluesToStructureness2d.Lightness.BRIGHT, structure_type = EigenvaluesToStructureness2d.StructureType.ROD, beta = 0.75, noise_cutoff = 0.5, output_image = None )
This function returns outputImage.
// Function prototype. public static IOLink.ImageView EigenvaluesToStructureness2d( IOLink.ImageView inputEigenvaluesImage, EigenvaluesToStructureness2d.Lightness lightness = ImageDev.EigenvaluesToStructureness2d.Lightness.BRIGHT, EigenvaluesToStructureness2d.StructureType structureType = ImageDev.EigenvaluesToStructureness2d.StructureType.ROD, double beta = 0.75, double noiseCutoff = 0.5, IOLink.ImageView outputImage = null );
Class Syntax
Parameters
Class Name | EigenvaluesToStructureness2d |
---|
Parameter Name | Description | Type | Supported Values | Default Value | |||||
---|---|---|---|---|---|---|---|---|---|
inputEigenvaluesImage |
The input image containing the eigenvalues field. Type must be float. Spectral series size is 2 (channel 0 = largest eigenvalue, channel 1 = smallest eigenvalue). | Image | Multispectral | nullptr | |||||
lightness |
The type of structure lightness to extract.
|
Enumeration | BRIGHT | ||||||
structureType |
The type of structure shapes to extract.
|
Enumeration | ROD | ||||||
beta |
The blobness sensitivity threshold. It corresponds to the beta term of the score equation. | Float64 | >0 | 0.75 | |||||
noiseCutoff |
The noise scale factor. It is used for computing the c term of the score equation. | Float64 | >0 | 0.5 | |||||
outputImage |
The score output image. X and Y dimensions, calibration and interpretation of the output image are forced to the same values as the input. The spectral dimension is forced to 1. Type is forced to float and all values are between 0 and 1. | Image | nullptr |
Object Examples
auto retina_eigenvalues = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "retina_eigenvalues.vip" ); EigenvaluesToStructureness2d eigenvaluesToStructureness2dAlgo; eigenvaluesToStructureness2dAlgo.setInputEigenvaluesImage( retina_eigenvalues ); eigenvaluesToStructureness2dAlgo.setLightness( EigenvaluesToStructureness2d::Lightness::BRIGHT ); eigenvaluesToStructureness2dAlgo.setStructureType( EigenvaluesToStructureness2d::StructureType::ROD ); eigenvaluesToStructureness2dAlgo.setBeta( 0.75 ); eigenvaluesToStructureness2dAlgo.setNoiseCutoff( 0.5 ); eigenvaluesToStructureness2dAlgo.execute(); std::cout << "outputImage:" << eigenvaluesToStructureness2dAlgo.outputImage()->toString();
retina_eigenvalues = imagedev.read_vip_image(imagedev_data.get_image_path("retina_eigenvalues.vip")) eigenvalues_to_structureness_2d_algo = imagedev.EigenvaluesToStructureness2d() eigenvalues_to_structureness_2d_algo.input_eigenvalues_image = retina_eigenvalues eigenvalues_to_structureness_2d_algo.lightness = imagedev.EigenvaluesToStructureness2d.BRIGHT eigenvalues_to_structureness_2d_algo.structure_type = imagedev.EigenvaluesToStructureness2d.ROD eigenvalues_to_structureness_2d_algo.beta = 0.75 eigenvalues_to_structureness_2d_algo.noise_cutoff = 0.5 eigenvalues_to_structureness_2d_algo.execute() print( "output_image:", str( eigenvalues_to_structureness_2d_algo.output_image ) )
ImageView retina_eigenvalues = Data.ReadVipImage( @"Data/images/retina_eigenvalues.vip" ); EigenvaluesToStructureness2d eigenvaluesToStructureness2dAlgo = new EigenvaluesToStructureness2d { inputEigenvaluesImage = retina_eigenvalues, lightness = EigenvaluesToStructureness2d.Lightness.BRIGHT, structureType = EigenvaluesToStructureness2d.StructureType.ROD, beta = 0.75, noiseCutoff = 0.5 }; eigenvaluesToStructureness2dAlgo.Execute(); Console.WriteLine( "outputImage:" + eigenvaluesToStructureness2dAlgo.outputImage.ToString() );
Function Examples
auto retina_eigenvalues = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "retina_eigenvalues.vip" ); auto result = eigenvaluesToStructureness2d( retina_eigenvalues, EigenvaluesToStructureness2d::Lightness::BRIGHT, EigenvaluesToStructureness2d::StructureType::ROD, 0.75, 0.5 ); std::cout << "outputImage:" << result->toString();
retina_eigenvalues = imagedev.read_vip_image(imagedev_data.get_image_path("retina_eigenvalues.vip")) result = imagedev.eigenvalues_to_structureness_2d( retina_eigenvalues, imagedev.EigenvaluesToStructureness2d.BRIGHT, imagedev.EigenvaluesToStructureness2d.ROD, 0.75, 0.5 ) print( "output_image:", str( result ) )
ImageView retina_eigenvalues = Data.ReadVipImage( @"Data/images/retina_eigenvalues.vip" ); IOLink.ImageView result = Processing.EigenvaluesToStructureness2d( retina_eigenvalues, EigenvaluesToStructureness2d.Lightness.BRIGHT, EigenvaluesToStructureness2d.StructureType.ROD, 0.75, 0.5 ); Console.WriteLine( "outputImage:" + result.ToString() );