Hi ITK Developers,

I was just looking through the OtsuThresholdCalculator and 
OtsuMultipleThresholdsCalculator to see whether I could refactor them so that 
the Otsu inherits from the OtsuMultiple since the latter is a more general case 
of the former.  Currently, the code for these two filters is totally different 
resulting in significant code duplication and a need to keep both filters in 
sync.

As a first step, I wrote a CMake test to check that the output of the 
OtsuMultiple with 1 threshold is the same as the output of the Otsu.  
Unfortunately, they are not!  The two filters output thresholds that are 
different by 1 histogram bin!  This can be a quite extreme difference when the 
numberOfHistogramBins is low, and it leads to different thresholds even when 
the numberOfHistogramBins is reasonably high (say 256).  I tracked it down to 
this code in the Calculators:

The relevant code from Otsu:
    const double tolerance = 0.00001;
    if ( (varBetween - tolerance) > maxVarBetween )
      {
      maxVarBetween = varBetween;
      maxBinNumber = j;
      }
    }
  this->GetOutput()->Set( static_cast<OutputType>( histogram->GetMeasurement( 
maxBinNumber + 1, 0 ) ) );

The relevant code from MultipleOtsu:
    if ( varBetween > maxVarBetween )
      {
      maxVarBetween = varBetween;
      maxVarThresholdIndexes = thresholdIndexes;
      }
    }
  for ( j = 0; j < m_NumberOfThresholds; j++ )
    {
    m_Output[j] = histogram->GetBinMax(0, maxVarThresholdIndexes[j]);
    }

The difference is that the Otsu adds one to the computed threshold whereas the 
MultipleOtsu does not.  This is problematic because users would expect them to 
give the same result.

My question is: how should we proceed?  If we change one or the other, people's 
code that use the changed one will give slightly different answers.  If we 
don't change them, the two filters will give different outputs for the same 
input, and it will not be possible to refactor them to share code.

What are your thoughts?

Thanks,
Dirk
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php

Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ

Follow this link to subscribe/unsubscribe:
http://www.itk.org/mailman/listinfo/insight-developers

Reply via email to