[ITK-users] OtsuMultipleThresholdsImageFilter creates asymmetric classes for symmetric a distribution
hellman
fredrik.hellman at gmail.com
Tue Oct 17 10:35:27 EDT 2017
Hi all,
I am planning to use OtsuMultipleThresholdsImageFilter to segment an image
into a number of classes. I started by testing it for a small image with
only a single threshold to see that I understand how it works. The results
surprise me though.
I create a 1D-image with four pixels: 1000, 2000, 3000 and 4000. Computing a
threshold to split this distribution into two classes of maximum
between-class variance should give a threshold between 2000 and 3000.
However, OtsuMultipleThresholdsImageFilter gives me a value 1996.17, which
puts 1000 in one class and 2000, 3000, 4000 in the other class. This does
not give the smallest between-class variance.
The code that I tried can be found below. Do I misunderstand how this filter
should work or is there a bug in its implementation?
Running the following code with ITK 4.12.0 and ITK 4.12.2 prints 1996.17:
#include <itkOtsuMultipleThresholdsImageFilter.h>
typedef itk::Image<float, 1> ImageType;
typedef itk::Image<int, 1> LabelImageType;
int main(int argc, char *argv[])
{
typename ImageType::Pointer input = ImageType::New();
ImageType::RegionType region;
region.GetModifiableSize()[0] = 4;
input->SetRegions(region);
input->Allocate();
ImageType::IndexType index;
index[0] = 0;
input->SetPixel(index, 1000);
index[0] = 1;
input->SetPixel(index, 2000);
index[0] = 2;
input->SetPixel(index, 3000);
index[0] = 3;
input->SetPixel(index, 4000);
auto otsuFilter = itk::OtsuMultipleThresholdsImageFilter<ImageType,
LabelImageType>::New();
otsuFilter->SetInput(input);
otsuFilter->SetNumberOfHistogramBins(128);
otsuFilter->SetNumberOfThresholds(1);
otsuFilter->Update();
std::cout << otsuFilter->GetThresholds()[0] << std::endl;
return 0;
}
Best wishes,
Fredrik Hellman
--
Sent from: http://itk-users.7.n7.nabble.com/
More information about the Insight-users
mailing list