[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-developers
mailing list