[Insight-developers] Re: [Insight-users] Histogram bug with maximum possible value ?

Karthik Krishnan Karthik.Krishnan at kitware.com
Thu Jun 8 19:05:02 EDT 2006


Actually, you just unearthed a nasty bug in itkHistogram.txx . The 
histogram was discarding the m_ClipBinsAtEnds variable in certain 
methods, so the ClipBinsAtEnds var no longer had any effect. I just 
comitted a fix :

http://public.kitware.com/cgi-bin/viewcvs.cgi/Code/Numerics/Statistics/itkHistogram.txx?root=Insight&r1=1.41&r2=1.42

Older versions of ITK should be patched with this fix too.

Gaetan Lehmann wrote:

>Karthik,
>
>I'm still able to reproduce the problem with itk 2.6.0, but no more with itk 
>cvs (3-4 days old).
>With ITK cvs, my code produce a warning about "converting to 'unsigned char' 
>from 'double'", so I guess the internal type has changed, and it solve the 
>issue.
>
>This change:
>
>  * Insight: changeset 2006-03-14 22:01:52 by ibanez
>  BUG: 2786. Histogram computation should internally be performed using
>  real types. Method should be offered to users for explicitly selecting
>  the min and max values for the histogram.
>
>  
>
This change is incidental and not directly connected to the bug. You 
will see if you follow the code.

Thanks for bringing up the bug.
-karthik

>should explain the difference of behavior.
>You have ran your tests with ITK cvs ?
>
>Gaetan
>
>
>On Thursday 08 June 2006 17:50, Karthik Krishnan wrote:
>  
>
>>Gaetan, Uwe, Luis:
>>
>>My point was that despite all that the histogram would be computed the
>>right way, without any user intervention, *even if you don't set the
>>bounds* (if you are using ScalarImageToHistogramGenerator. Otsu uses
>>that)...
>>
>>See
>>http://www.itk.org/cgi-bin/viewcvs.cgi/Code/Numerics/Statistics/itkListSamp
>>leToHistogramGenerator.txx?annotate=1.14&root=Insight
>>
>>The min and max are automatically computed for you in line 63 and that
>>will be 255 in your case
>>Line 90 : The upper bound of the histogram is set to 255 + 1 = 256. So
>>the histogram should be fine too.
>>
>>I just checked the code snippets with a debugger to see if there were
>>overflows due to datatype etc.. and its fine..
>>
>>So what is the bug here ? Could I please have a minimal code where it
>>doesn't work.
>>
>>[ You can run Examples/Statistics/ImageHistogram2.cxx after commenting
>>out the SetHistogramMin/Max part on a binary image, such as
>>Insight/Examples/Data/Circle.png - UCHAR image with pixels 0/255 and
>>your histogram will still be fine].
>>
>>Am I mistaken here ?
>>
>>Thanks
>>-karthik
>>
>>Gaetan Lehmann wrote:
>>    
>>
>>>Hi Luis,
>>>
>>>So it explain the observed behavior :-)
>>>However, a naive user (let say me) would think the following code
>>>(stollen  from itkOtsuMultipleThresholdsImageFilter.txx to implement
>>>my own filter)  will return an histogram with all the values:
>>>
>>>  // Create a histogram of the image intensities
>>>  typename HistogramGeneratorType::Pointer histogramGenerator =
>>>HistogramGeneratorType::New();
>>>  histogramGenerator->SetInput(  this->GetInput()  );
>>>  histogramGenerator->SetNumberOfBins( m_NumberOfHistogramBins );
>>>  histogramGenerator->Compute();
>>>
>>>By the way, does it mean that OtsuMultipleThresholdsImageFilter code
>>>is  broken ?
>>>Perhaps the class ScalarImageToHistogramGenerator should be modified
>>>to  set the min and max values to include all the values ?
>>>
>>>Gaetan
>>>
>>>
>>>On Thu, 08 Jun 2006 14:00:25 +0200, Luis Ibanez
>>>
>>><luis.ibanez at kitware.com>  wrote:
>>>      
>>>
>>>>For mor details, you may want to look at the Examples:
>>>>
>>>>
>>>>       Insight/
>>>>             Examples/
>>>>                Statistics/
>>>>                       ImageHistogram1.cxx
>>>>                       ImageHistogram2.cxx
>>>>
>>>>in particular to the call for the methods:
>>>>
>>>>          SetHistogramMin()
>>>>          SetHistogramMax()
>>>>
>>>>
>>>>Note again that the min and max values of the histogram
>>>>refer here to the values of the bin bounds, not the the
>>>>values to be accepted in the bins.
>>>>
>>>>For an image of integer pixel type, the bounds of the
>>>>bins must be of the type K-0.5,K+0.5, so that the bin
>>>>accepts the value K (where K is an integer).
>>>>
>>>>
>>>>    Luis
>>>>
>>>>
>>>>---------------------
>>>>
>>>>Luis Ibanez wrote:
>>>>        
>>>>
>>>>> This is a known behavior of the Histogram.
>>>>> The correct way to use the histogram class for an image of 8-bits
>>>>>is to set the minimum and maximum to values such as -0.5 and 255.5
>>>>> Note that the types for setting min and max are not the image pixel
>>>>>type but its RealType.
>>>>> The reason is that the min and max that we pass to the histogram
>>>>>class are the values for the min of the first bin and the max of
>>>>>the last bin.
>>>>> If you want to include all the samples, the min value of the bin
>>>>>bounds must be lower that the actual minimum value expected in the
>>>>>population, and the max value of the bin bounds must be larger
>>>>>than the minimum value expected in the population.  This is standard
>>>>>for computing histogram.
>>>>> The unfortunate fact is that there are too many bad habits acquired
>>>>>for people that got used to work only with 8-bit images, and expect
>>>>>the min and max of the histogram to be 0 and 255. Those are actually
>>>>>the mid-values of the bins, not the bounds of the bins.
>>>>> It may be convenient to have a helper initializer class to set the
>>>>>min and max values for images of (char) and (unsigned char) so that
>>>>>user's do not have to think about these details.
>>>>>       Luis
>>>>>   =========================
>>>>>
>>>>>Karthik Krishnan wrote:
>>>>>          
>>>>>
>>>>>>The histogram class is a widely used class. Please file a bug
>>>>>>report  and assign it to me with a high priority.
>>>>>>
>>>>>>-----
>>>>>>
>>>>>>That said, I am surprised, it does not handle pixels with
>>>>>>intensity  255. See lines 90-102 of
>>>>>>http://www.itk.org/cgi-bin/viewcvs.cgi/Code/Numerics/Statistics/itkLis
>>>>>>tSampleToHistogramGenerator.txx?annotate=1.14&root=Insight h_upper[i] =
>>>>>>((THistogramMeasurement) upper[i]) +
>>>>>>         NumericTraits< THistogramMeasurement >::One ;
>>>>>>       if(h_upper[i] <= upper[i])
>>>>>>         {
>>>>>>         // an overflow has occurred therefore set upper to upper
>>>>>>         h_upper[i] = upper[i];
>>>>>>         // Histogram measurement type would force the clipping
>>>>>>the  max value.
>>>>>>         // Therefore we must call the following to include the
>>>>>>max  value:
>>>>>>         m_Histogram->SetClipBinsAtEnds(false);
>>>>>>         }
>>>>>>
>>>>>>If pixel type is UCHAR, it should go into that if block and do the
>>>>>>SetClipBinsAtEnds(false) thing. That would mean that the bins at
>>>>>>the  edges of the histogram extend to infinity, so really 255
>>>>>>should be  considered.   [ In the default case, the ends are
>>>>>>clipped, See  constructor of itk::Histogram with sets
>>>>>>ClipBinsAtEnds to true (so 255  won't be considered), but that's
>>>>>>not the case with you since you are  using the
>>>>>>ScalarImageToHistogramGenerator.  ]
>>>>>>
>>>>>>
>>>>>>Thanks for reporting this.
>>>>>>-karthik
>>>>>>
>>>>>>Gaetan Lehmann wrote:
>>>>>>            
>>>>>>
>>>>>>>Hi,
>>>>>>>
>>>>>>>I am the only one to have this problem ?
>>>>>>>Should I file a bug report ?
>>>>>>>
>>>>>>>Gaetan
>>>>>>>
>>>>>>>
>>>>>>>On Fri, 02 Jun 2006 17:11:45 +0200, Gaetan Lehmann
>>>>>>>
>>>>>>><gaetan.lehmann at jouy.inra.fr> wrote:
>>>>>>>              
>>>>>>>
>>>>>>>>I forgot to say I'm using ITK 2.6.0 with gcc 4.0
>>>>>>>>
>>>>>>>>On Fri, 02 Jun 2006 16:23:25 +0200, Gaetan Lehmann
>>>>>>>>
>>>>>>>><gaetan.lehmann at jouy.inra.fr> wrote:
>>>>>>>>                
>>>>>>>>
>>>>>>>>>Hi,
>>>>>>>>>
>>>>>>>>>I'm trying to manipulate histograms, with itk::Histogram. I'm
>>>>>>>>>generating
>>>>>>>>>the histogram from an image with the
>>>>>>>>>ScalarImageToHistogramGenerator
>>>>>>>>>class. The pixel type of the input image is unsigned char.
>>>>>>>>>Everything seems to work, as long as there is no pixel value =
>>>>>>>>>255  in  the
>>>>>>>>>image.
>>>>>>>>>All the pixels with an intensity of 255 are not counted in the
>>>>>>>>>histogram.
>>>>>>>>>For example, the attached image (a 10x10 black image with 4
>>>>>>>>>white  (255)
>>>>>>>>>pixels) produce an histogram with 96 pixels according to the
>>>>>>>>>GetTotalFrequency() result.
>>>>>>>>>
>>>>>>>>>Is it a bug ?
>>>>>>>>>Or I have missed something ?
>>>>>>>>>
>>>>>>>>>Regards,
>>>>>>>>>
>>>>>>>>>Gaetan
>>>>>>>>>                  
>>>>>>>>>
>>>>>>_______________________________________________
>>>>>>Insight-users mailing list
>>>>>>Insight-users at itk.org
>>>>>>http://www.itk.org/mailman/listinfo/insight-users
>>>>>>            
>>>>>>
>>>>>  _______________________________________________
>>>>>Insight-developers mailing list
>>>>>Insight-developers at itk.org
>>>>>http://www.itk.org/mailman/listinfo/insight-developers
>>>>>          
>>>>>
>>>>_______________________________________________
>>>>Insight-users mailing list
>>>>Insight-users at itk.org
>>>>http://www.itk.org/mailman/listinfo/insight-users
>>>>        
>>>>


More information about the Insight-users mailing list