[Insight-users] Still struggling with extracting information about objects resulting from a segmentation
Neal R. Harvey
harve at lanl.gov
Thu Mar 11 11:27:44 EST 2010
I am still struggling with getting the information I need about the
various regions (objects) that
I obtain from a segmentation.
I am using ITK's watershed code to segment an image.
Then, I want to calculate various attributes of each of the regions
found in the segmentation.
For attribute calculation, I am trying to use the ShapeLabelMapFilter,
etc. as described in
Lehmann's paper, entitled "Label Object Representation and Manipulation
with ITK".
Richard Beare offered some hints last time and I have been trying to use
that, together with the
information in the paper referred to above.
Below is the snippet of code that I wrote that starts at the point where
I have obtained a
segmentation from the watershed algorithm. The code compiles with no
problem.
What I would expect that, if this was doing what I was hoping it would
do, I would see
the same number of objects being reported from the ShapeLabelMapFilter
as the number
of regions that is getting reported from the watershed segmentation.
However, I get the
number of objects reported from the ShapeLabelMapFilter as zero.
Can anyone suggest a fix or has any idea as to what I am doing wrong?
On a slightly different, but related (i.e. it isn't a problem at the
moment, as the problem
described above is not allowing the calculation of the object
attributes, as it doesn't
think there are any object), is if I include calls to GetFeretDiameter()
or GetEquivalentRadius()
the code won't even compile!
WatershedFilter->SetLevel( watershedLevel );
WatershedFilter->SetThreshold( watershedThreshold );
WatershedFilter->SetInput( TemporaryImage );
WatershedFilter->Update();
// The output of the watershed is an image of unsigned long int
typedef unsigned long WatershedPixelType;
typedef itk::Image< WatershedPixelType, Dimension >
WatershedImageType;
WatershedImageType::Pointer WatershedImage = WatershedFilter->GetOutput();
// Below we instantiate the MinimumMaximumImageCalculator class
typedef itk::MinimumMaximumImageFilter< WatershedImageType >
MinimumMaximumWatershedImageFilterType;
// A MinimumMaximumWatershedImageFilter object is constructed
MinimumMaximumWatershedImageFilterType::Pointer
MinimumMaximumWatershedImageFilter =
MinimumMaximumWatershedImageFilterType::New();
MinimumMaximumWatershedImageFilter->SetInput( WatershedImage );
MinimumMaximumWatershedImageFilter->Update();
WatershedPixelType outputMinVal =
MinimumMaximumWatershedImageFilter->GetMinimum();
WatershedPixelType outputMaxVal =
MinimumMaximumWatershedImageFilter->GetMaximum();
std::cerr << "Minimum Value from Segmented Image = " <<
(int)outputMinVal << std::endl;
std::cerr << "Maximum Value from Segmented Image = " <<
(int)outputMaxVal << std::endl;
// OK So, now we have a labeled image output from the watershed
// We now want to calculate various characteristics of the objects in the
// labeled image
typedef unsigned long LabelType;
typedef itk::ShapeLabelObject< LabelType, Dimension > LabelObjectType;
typedef itk::LabelMap< LabelObjectType > LabelMapType;
// First we need to convert the output from the watershed filter to a
// collection of label objects
typedef itk::LabelImageToShapeLabelMapFilter< WatershedImageType,
LabelMapType > ConverterType;
ConverterType::Pointer converter = ConverterType::New();
converter->SetInput( WatershedImage );
// Then, can we evaluate the attributes with the dedicated filtr:
ShapeLabelMapFilter?
typedef itk::ShapeLabelMapFilter< LabelMapType > ShapeFilterType;
ShapeFilterType::Pointer shape = ShapeFilterType::New();
shape->SetInput( converter->GetOutput() );
shape->Update();
LabelMapType::Pointer labelMap = converter->GetOutput();
unsigned int NumberOfLabelObjects = labelMap->GetNumberOfLabelObjects();
std::cout << "labelMap->GetNumberOfLabelObjects() = " <<
NumberOfLabelObjects << std::endl;
if (NumberOfLabelObjects < 1) {
std::cerr << "Number of Label Objects is incorrect" << std::endl;
return EXIT_FAILURE;
} else {
for (unsigned int label = 1; label <= NumberOfLabelObjects; label++) {
const LabelObjectType * labelObject = labelMap->GetLabelObject(
label );
//"; FeretDiameter = " << labelObject->GetFeretDiameter() << ";
EquivalentRadius = " << labelObject->GetEquivalentRadius() <<
std::cout << "Label #: " << label << "; Size = " <<
labelObject->GetSize() << "; Perimeter = " <<
labelObject->GetPerimeter() << std::endl;
return EXIT_SUCCESS;
}
}
More information about the Insight-users
mailing list