Label Analysis
This example shows how to extract individual measurements for each object of a segmented image.
First, a binary image is opened from a vip file. The vip file format is an internal format dedicated to store
images with all relevant information for ImageDev. This image is immediately identified as a binary image and
can be labeled with the Label2d algorithm.
Then, an AnalysisMsr object is initialized. It is set up to contain two measurements: EquivalentDiameter2d and FeretRatio2d. At last, the analysis is performed and both measurements are computed for each object of the label image. The results are printed in the standard output.
See also
Then, an AnalysisMsr object is initialized. It is set up to contain two measurements: EquivalentDiameter2d and FeretRatio2d. At last, the analysis is performed and both measurements are computed for each object of the label image. The results are printed in the standard output.
| Performing the label analysis... | ||||
| Number of objects = 58 | ||||
| Label | EquivalentDiameter | FeretRatio2d | ||
| 1 | 57.83 | 1.04 | ||
| 2 | 49.03 | 1.00 | ||
| 3 | 50.49 | 1.02 | ||
| 4 | 60.69 | 1.02 | ||
#include <ImageDev/ImageDev.h>
#include <ioformat/IOFormat.h>
#include <string.h>
using namespace imagedev;
using namespace ioformat;
using namespace iolink;
int
main( int argc, char* argv[] )
{
int status = 0;
try
{
// ImageDev library initialization
if ( isInitialized() == false )
imagedev::init();
// Open a binary image from a vip file
auto imageInput = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene_sep.vip" );
// Connected component labeling of the binary image
std::cout << "Labeling the binary input..." << std::endl;
auto imageLab = labeling2d( imageInput, Labeling2d::LABEL_8_BIT, Labeling2d::CONNECTIVITY_8 );
// Define the analysis features to be computed
std::cout << "Performing the label analysis..." << std::endl;
AnalysisMsr::Ptr analysis = std::make_shared< AnalysisMsr >();
auto diameter = analysis->select( NativeMeasurements::equivalentDiameter );
auto feretRatio = analysis->select( NativeMeasurements::feretRatio2d );
// Launch the feature extraction on the segmented image
labelAnalysis( imageLab, imageInput, analysis );
size_t labelCount = analysis->labelCount();
std::cout << " - Number of objects = " << labelCount << std::endl;
// Print the 4 first results of the analysis
std::cout << "Label\t" << diameter->name() << "\t" << feretRatio->name() << std::endl;
for ( int i = 0; i < 4; i++ )
{
std::cout << ( i + 1 ) << "\t" << diameter->value( i ) << "\t\t\t" << feretRatio->value( i ) << std::endl;
}
std::cout << "This example ran successfully." << std::endl;
}
catch ( const imagedev::Exception& error )
{
// Print potential exception in the standard output
std::cerr << "ImageDev exception: " << error.what() << std::endl;
status = -1;
}
// ImageDev library finalization
imagedev::finish();
// Check if we must ask for an enter key to close the program
if ( !( ( argc == 2 ) && strcmp( argv[1], "--no-stop-at-end" ) == 0 ) )
std::cout << "Press Enter key to close this window." << std::endl, getchar();
return status;
}
using System;
using ImageDev;
using IOLink;
using IOFormat;
namespace T04_02_LabelAnalysis
{
class Program
{
static void Main(string[] args)
{
int status = 0;
try
{
// ImageDev library initialization
if (Initialization.IsInitialized() == false)
Initialization.Init();
// Open a binary image from a vip file
ImageView imageInput = Data.ReadVipImage("Data/images/polystyrene_sep.vip") as ImageView;
// Connected component labeling of a binary image
Console.WriteLine("Labeling the binary input...");
var imageLab = Processing.Labeling2d(imageInput);
// Define the analysis features to be computed
Console.WriteLine("Performing the label analysis...");
AnalysisMsr analysis = new AnalysisMsr();
var diameter = analysis.Select(NativeMeasurements.EquivalentDiameter);
var feretRatio = analysis.Select(NativeMeasurements.FeretRatio2d);
// Launch the feature extraction on the segmented image
Processing.LabelAnalysis(imageLab, imageInput, analysis);
int labelCount = analysis.LabelCount();
Console.WriteLine(" - Number of objects = " + labelCount);
Console.WriteLine("Label\t" + diameter.Name() + "\t" + feretRatio.Name());
// Print the 4 first results of the analysis
for (int i = 0; i < 4; i++)
{
Console.WriteLine((i + 1) + "\t" + diameter.Value(i).ToString("0.00") + "\t\t\t" +
feretRatio.Value(i).ToString("0.00"));
}
// Notify the garbage collector that the created images can be freed
imageInput.Dispose();
imageLab.Dispose();
}
catch (Exception error)
{
// Print potential exception in the standard output
System.Console.WriteLine("HelloImageDev exception: " + error.ToString());
status = -1;
}
// ImageDev library finalization
Initialization.Finish();
// Check if we must ask for an enter key to close the program
if (!((args.Length >= 1) && (args[0] == "--no-stop-at-end")))
{
System.Console.WriteLine("Press Enter key to close this window.");
System.Console.ReadKey();
}
System.Environment.Exit(status);
}
}
}
import imagedev
import imagedev_data
# Initialize the ImageDev library if not done
if (imagedev.is_initialized() == False): imagedev.init()
# Open a binary image from a vip file
image_input = imagedev.read_vip_image(imagedev_data.get_image_path("polystyrene_sep.vip"))
# Connected component labeling of the binary image
print("Labeling the binary input...")
image_lab = imagedev.labeling_2d(image_input, imagedev.Labeling2d.LabelType.LABEL_8_BIT)
# Define the analysis features to be computed
print("Performing the label analysis...")
analysis = imagedev.AnalysisMsr()
diameter = analysis.select(imagedev.native_measurements.EquivalentDiameter)
feret_ratio = analysis.select(imagedev.native_measurements.FeretRatio2d)
# Launch the feature extraction on the segmented image
imagedev.label_analysis(image_lab, image_input, analysis)
label_count = analysis.label_count
print(" - Number of objects = " + str(label_count))
# Print the 4 first results of the analysis
print("Label\t" + diameter.name + "\t" + feret_ratio.name)
for i in range(3):
print(str(i+1) + '\t\t\t' + "{:.2f}".format(diameter.value(i)) + '\t\t\t\t' + "{:.2f}".format(feret_ratio.value(i)))
# ImageDev library finalization
imagedev.finish() See also