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

Karthik Krishnan Karthik.Krishnan at kitware.com
Thu Jun 8 11:50:18 EDT 2006


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/itkListSampleToHistogramGenerator.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/itkListSampleToHistogramGenerator.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