ImageDev

ApplyMorphologicalLut2d

Applies a predefined morphological lookup table (LUT) on a two-dimensional binary image.

Access to parameter description

For an introduction: Applying a morphological LUT amounts to moving some predefined configurations of neighborhoods in a binary image, and then applying decisions when this configuration is encountered or not. It can be used to compute morphological operators such as thinning, thickening, or hit-or-miss in an optimized way.

Before launching this algorithm, a MorphologicalLut2d object has to be built and set as the morphologicalLut parameter. The kernels defining the searched configurations can be inserted in this object with its addKernel method.

See also

Function Syntax

This function returns a ApplyMorphologicalLut2dOutput structure containing outputBinaryImage and outputMeasurement.
// Output structure of the applyMorphologicalLut2d function.
struct ApplyMorphologicalLut2dOutput
{
    /// The binary output image. Its size and type are forced to the same values as the input.
    std::shared_ptr< iolink::ImageView > outputBinaryImage;
    /// The output object containing the number of modified voxels by the selected LUT.
    ApplyMorphologicalLutMsr::Ptr outputMeasurement;
};

// Function prototype
ApplyMorphologicalLut2dOutput applyMorphologicalLut2d( std::shared_ptr< iolink::ImageView > inputBinaryImage, imagedev::MorphologicalLut2d::Ptr morphologicalLut, ApplyMorphologicalLut2d::MatchingFlag matchingFlag, ApplyMorphologicalLut2d::UnmatchingFlag unmatchingFlag, ApplyMorphologicalLut2d::BorderCondition borderCondition, std::shared_ptr< iolink::ImageView > outputBinaryImage = NULL, ApplyMorphologicalLutMsr::Ptr outputMeasurement = NULL );
This function returns a tuple containing output_binary_image and output_measurement.
// Function prototype.
apply_morphological_lut_2d( input_binary_image,
                            morphological_lut,
                            matching_flag = ApplyMorphologicalLut2d.MatchingFlag.M_SET_ONE,
                            unmatching_flag = ApplyMorphologicalLut2d.UnmatchingFlag.U_SET_ZERO,
                            border_condition = ApplyMorphologicalLut2d.BorderCondition.ZERO,
                            output_binary_image = None,
                            output_measurement = None )
This function returns a ApplyMorphologicalLut2dOutput structure containing outputBinaryImage and outputMeasurement.
/// Output structure of the ApplyMorphologicalLut2d function.
public struct ApplyMorphologicalLut2dOutput
{
    /// 
    /// The binary output image. Its size and type are forced to the same values as the input.
    /// 
    public IOLink.ImageView outputBinaryImage;
    /// The output object containing the number of modified voxels by the selected LUT.
    public ApplyMorphologicalLutMsr outputMeasurement;
};

// Function prototype.
public static ApplyMorphologicalLut2dOutput
ApplyMorphologicalLut2d( IOLink.ImageView inputBinaryImage,
                         Data.MorphologicalLut2d morphologicalLut,
                         ApplyMorphologicalLut2d.MatchingFlag matchingFlag = ImageDev.ApplyMorphologicalLut2d.MatchingFlag.M_SET_ONE,
                         ApplyMorphologicalLut2d.UnmatchingFlag unmatchingFlag = ImageDev.ApplyMorphologicalLut2d.UnmatchingFlag.U_SET_ZERO,
                         ApplyMorphologicalLut2d.BorderCondition borderCondition = ImageDev.ApplyMorphologicalLut2d.BorderCondition.ZERO,
                         IOLink.ImageView outputBinaryImage = null,
                         ApplyMorphologicalLutMsr outputMeasurement = null );

Class Syntax

Parameters

Class Name ApplyMorphologicalLut2d

Parameter Name Description Type Supported Values Default Value
input
inputBinaryImage
The binary input image. Image Binary nullptr
input
morphologicalLut
The input morphological LUT array defining the configurations to detect. MorphologicalLut2d MorphologicalLut2d::New( MorphologicalKernel2d::New( MorphologicalKernel2d::ONE ) )
input
matchingFlag
The value to set when a predefined configuration is encountered.
M_SET_ZERO The output value is forced to 0.
M_SET_ONE The output value is forced to 1.
M_CHANGE The output value is the logical negation of the input value.
M_PRESERVE The output value is equal to the input value.
Enumeration M_SET_ONE
input
unmatchingFlag
The value to set when the predefined configuration is not encountered.
U_SET_ZERO The output value is forced to 0.
U_SET_ONE The output value is forced to 1.
U_CHANGE The output value is the logical negation of the input value.
U_PRESERVE The output value is equal to the input value.
Enumeration U_SET_ZERO
input
borderCondition
The border condition used to extrapolate outside pixels.
ZERO Pixels outside of the image are considered as having the value 0.
MIRROR Pixels outside of the image are a replication the border image pixels.
Enumeration ZERO
output
outputBinaryImage
The binary output image. Its size and type are forced to the same values as the input. Image nullptr
output
outputMeasurement
The output object containing the number of modified voxels by the selected LUT. ApplyMorphologicalLutMsr nullptr

Object Examples

auto polystyrene_mask = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene_mask.vip" );

ApplyMorphologicalLut2d applyMorphologicalLut2dAlgo;
applyMorphologicalLut2dAlgo.setInputBinaryImage( polystyrene_mask );
applyMorphologicalLut2dAlgo.setMorphologicalLut( MorphologicalLut2d::New( MorphologicalKernel2d::New( MorphologicalKernel2d::ONE ) ) );
applyMorphologicalLut2dAlgo.setMatchingFlag( ApplyMorphologicalLut2d::MatchingFlag::M_SET_ONE );
applyMorphologicalLut2dAlgo.setUnmatchingFlag( ApplyMorphologicalLut2d::UnmatchingFlag::U_SET_ZERO );
applyMorphologicalLut2dAlgo.setBorderCondition( ApplyMorphologicalLut2d::BorderCondition::ZERO );
applyMorphologicalLut2dAlgo.execute();

std::cout << "outputBinaryImage:" << applyMorphologicalLut2dAlgo.outputBinaryImage()->toString();
std::cout << "modifiedPixelCount: " << applyMorphologicalLut2dAlgo.outputMeasurement()->modifiedPixelCount( 0 ) ;
polystyrene_mask = imagedev.read_vip_image(imagedev_data.get_image_path("polystyrene_mask.vip"))

apply_morphological_lut_2d_algo = imagedev.ApplyMorphologicalLut2d()
apply_morphological_lut_2d_algo.input_binary_image = polystyrene_mask
apply_morphological_lut_2d_algo.morphological_lut = imagedev.MorphologicalLut2d(imagedev.MorphologicalKernel2d(imagedev.MorphologicalKernel2d.Value.ONE))
apply_morphological_lut_2d_algo.matching_flag = imagedev.ApplyMorphologicalLut2d.M_SET_ONE
apply_morphological_lut_2d_algo.unmatching_flag = imagedev.ApplyMorphologicalLut2d.U_SET_ZERO
apply_morphological_lut_2d_algo.border_condition = imagedev.ApplyMorphologicalLut2d.ZERO
apply_morphological_lut_2d_algo.execute()

print( "output_binary_image:", str( apply_morphological_lut_2d_algo.output_binary_image ) )
print( "modifiedPixelCount: ", str( apply_morphological_lut_2d_algo.output_measurement.modified_pixel_count( 0 ) ) )
ImageView polystyrene_mask = Data.ReadVipImage( @"Data/images/polystyrene_mask.vip" );

ApplyMorphologicalLut2d applyMorphologicalLut2dAlgo = new ApplyMorphologicalLut2d
{
    inputBinaryImage = polystyrene_mask,
    morphologicalLut = new Data.MorphologicalLut2d(new Data.MorphologicalKernel2d(Data.MorphologicalKernel2d.Value.ONE)),
    matchingFlag = ApplyMorphologicalLut2d.MatchingFlag.M_SET_ONE,
    unmatchingFlag = ApplyMorphologicalLut2d.UnmatchingFlag.U_SET_ZERO,
    borderCondition = ApplyMorphologicalLut2d.BorderCondition.ZERO
};
applyMorphologicalLut2dAlgo.Execute();

Console.WriteLine( "outputBinaryImage:" + applyMorphologicalLut2dAlgo.outputBinaryImage.ToString() );
Console.WriteLine( "modifiedPixelCount: " + applyMorphologicalLut2dAlgo.outputMeasurement.modifiedPixelCount( 0 ) );

Function Examples

auto polystyrene_mask = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene_mask.vip" );

auto result = applyMorphologicalLut2d( polystyrene_mask, MorphologicalLut2d::New( MorphologicalKernel2d::New( MorphologicalKernel2d::ONE ) ), ApplyMorphologicalLut2d::MatchingFlag::M_SET_ONE, ApplyMorphologicalLut2d::UnmatchingFlag::U_SET_ZERO, ApplyMorphologicalLut2d::BorderCondition::ZERO );

std::cout << "outputBinaryImage:" << result.outputBinaryImage->toString();
std::cout << "modifiedPixelCount: " << result.outputMeasurement->modifiedPixelCount( 0 ) ;
polystyrene_mask = imagedev.read_vip_image(imagedev_data.get_image_path("polystyrene_mask.vip"))

result_output_binary_image, result_output_measurement = imagedev.apply_morphological_lut_2d( polystyrene_mask, imagedev.MorphologicalLut2d(imagedev.MorphologicalKernel2d(imagedev.MorphologicalKernel2d.Value.ONE)), imagedev.ApplyMorphologicalLut2d.M_SET_ONE, imagedev.ApplyMorphologicalLut2d.U_SET_ZERO, imagedev.ApplyMorphologicalLut2d.ZERO )

print( "output_binary_image:", str( result_output_binary_image ) )
print( "modifiedPixelCount: ", str( result_output_measurement.modified_pixel_count( 0 ) )  )
ImageView polystyrene_mask = Data.ReadVipImage( @"Data/images/polystyrene_mask.vip" );

Processing.ApplyMorphologicalLut2dOutput result = Processing.ApplyMorphologicalLut2d( polystyrene_mask, new Data.MorphologicalLut2d(new Data.MorphologicalKernel2d(Data.MorphologicalKernel2d.Value.ONE)), ApplyMorphologicalLut2d.MatchingFlag.M_SET_ONE, ApplyMorphologicalLut2d.UnmatchingFlag.U_SET_ZERO, ApplyMorphologicalLut2d.BorderCondition.ZERO );

Console.WriteLine( "outputBinaryImage:" + result.outputBinaryImage.ToString() );
Console.WriteLine(  "modifiedPixelCount: " + result.outputMeasurement.modifiedPixelCount( 0 )  );