Another thought along these lines is to refer to the defacto standard in these<br>issues, namely MATLAB.&nbsp; MATLAB will autocalculate bins for you or you<br>can specify bin centers (off the top of my head, I think it does centers not bounds
<br>but I could be wrong).&nbsp; What does matlab do with the data far outside a specified <br>first/last bin?<br><br>Jim<br><br><div><span class="gmail_quote">On 6/10/06, <b class="gmail_sendername">Jim Miller</b> &lt;<a href="mailto:millerjv@gmail.com">
millerjv@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div>Karthik,<br><br>I think the ScalarImageToHistogramGenerator should set the min/max bounds
<br>to be k-0.5, k+0.5 as Luis indicated.&nbsp; This is how I build my histograms for <br>integral types.<br><br>I think the code</div><div><span class="q"><br><br> &nbsp; &nbsp;&nbsp;&nbsp; h_upper[i] = ((THistogramMeasurement) upper[i]) +
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NumericTraits&lt; THistogramMeasurement &gt;::One ;<br> &nbsp; &nbsp; &nbsp; &nbsp;if(h_upper[i] &lt;= upper[i])<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// an overflow has occurred therefore set upper to upper<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;h_upper[i] = upper[i];
<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Histogram measurement type would force the clipping the max<br>value.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Therefore we must call the following to include the max value:<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_Histogram-&gt;SetClipBinsAtEnds<div style="direction: ltr;">

(false);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br></div><br></span></div><div>should be scrapped for integral types and specify the bins with as k-0.5,k+0.5.<br>Then the ClipBinsAtEnds does not need to be used.<br><br>On a side note, we may want to come up with a synonym/antonym for ClipBinsAtEnds.
<br>What this mode is doing is deciding whether to include all the mass in the <br>distribution that is outside the histogram domain in the first/last bin verses<br>just ignoring that mass. I just don't know a better name right now..
<br><br>AutoExpandHistogramDomain()<br>IgnoreDataOutsideHistogramDomain(), IngoreMeasurementsOutsideHistogramDomain()<br>IncludeDataOutsideHistogramDomain(), IncludeMeasurementsOutsideHistogramDomain()<br><br>These modes bring up an interesting question. If the ClipBinsAtEnds is off, then the first/last
<br>bin runs to -+ infinity respectively.&nbsp; If you then ask for the bin bounds, should the first/last bin<br>report that their bounds are -+ infinity respectively?&nbsp; Probably should.<br></div><div><span class="sg"><br>Jim</span>
</div><div><span class="e" id="q_10bbdf1674b3ed40_4"><br><br><br><div><span class="gmail_quote">
On 6/8/06, <b class="gmail_sendername">Karthik Krishnan</b> &lt;<a href="mailto:Karthik.Krishnan@kitware.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">Karthik.Krishnan@kitware.com</a>&gt; wrote:
</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Gaetan, Uwe, Luis:<br><br>My point was that despite all that the histogram would be computed the<br>right way, without any user intervention, *even if you don't set the<br>bounds* (if you are using ScalarImageToHistogramGenerator. Otsu uses
<br>that)...<br><br>See<br><a href="http://www.itk.org/cgi-bin/viewcvs.cgi/Code/Numerics/Statistics/itkListSampleToHistogramGenerator.txx?annotate=1.14&amp;root=Insight" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://www.itk.org/cgi-bin/viewcvs.cgi/Code/Numerics/Statistics/itkListSampleToHistogramGenerator.txx?annotate=1.14&amp;root=Insight
</a><br><br>The min and max are automatically computed for you in line 63 and that<br>will be 255 in your case<br>Line 90 : The upper bound of the histogram is set to 255 + 1 = 256. So<br>the histogram should be fine too.
<br><br>I just checked the code snippets with a debugger to see if there were<br>overflows due to datatype etc.. and its fine..<br><br>So what is the bug here ? Could I please have a minimal code where it<br>doesn't work.
<br><br>[ You can run Examples/Statistics/ImageHistogram2.cxx after commenting<br>out the SetHistogramMin/Max part on a binary image, such as<br>Insight/Examples/Data/Circle.png - UCHAR image with pixels 0/255 and<br>your histogram will still be fine].
<br><br>Am I mistaken here ?<br><br>Thanks<br>-karthik<br><br><br><br>Gaetan Lehmann wrote:<br><br>&gt;<br>&gt; Hi Luis,<br>&gt;<br>&gt; So it explain the observed behavior :-)<br>&gt; However, a naive user (let say me) would think the following code
<br>&gt; (stollen&nbsp;&nbsp;from itkOtsuMultipleThresholdsImageFilter.txx to implement<br>&gt; my own filter)&nbsp;&nbsp;will return an histogram with all the values:<br>&gt;<br>&gt;&nbsp;&nbsp; // Create a histogram of the image intensities<br>&gt;&nbsp;&nbsp; typename HistogramGeneratorType::Pointer histogramGenerator =
<br>&gt; HistogramGeneratorType::New();<br>&gt;&nbsp;&nbsp; histogramGenerator-&gt;SetInput(&nbsp;&nbsp;this-&gt;GetInput()&nbsp;&nbsp;);<br>&gt;&nbsp;&nbsp; histogramGenerator-&gt;SetNumberOfBins( m_NumberOfHistogramBins );<br>&gt;&nbsp;&nbsp; histogramGenerator-&gt;Compute();
<br>&gt;<br>&gt; By the way, does it mean that OtsuMultipleThresholdsImageFilter code<br>&gt; is&nbsp;&nbsp;broken ?<br>&gt; Perhaps the class ScalarImageToHistogramGenerator should be modified<br>&gt; to&nbsp;&nbsp;set the min and max values to include all the values ?
<br>&gt;<br>&gt; Gaetan<br>&gt;<br>&gt;<br>&gt; On Thu, 08 Jun 2006 14:00:25 +0200, Luis Ibanez<br>&gt; &lt;<a href="mailto:luis.ibanez@kitware.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
luis.ibanez@kitware.com</a>&gt;&nbsp;&nbsp;wrote:<br>&gt;<br>&gt;&gt;<br>&gt;&gt; For mor details, you may want to look at the Examples:
<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Insight/<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Examples/<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statistics/<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageHistogram1.cxx<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageHistogram2.cxx

<br>&gt;&gt;<br>&gt;&gt; in particular to the call for the methods:<br>&gt;&gt;<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetHistogramMin()<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetHistogramMax()<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; Note again that the min and max values of the histogram
<br>&gt;&gt; refer here to the values of the bin bounds, not the the<br>&gt;&gt; values to be accepted in the bins.<br>&gt;&gt;<br>&gt;&gt; For an image of integer pixel type, the bounds of the<br>&gt;&gt; bins must be of the type 
K-0.5,K+0.5, so that the bin<br>&gt;&gt; accepts the value K (where K is an integer).<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp; Luis<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; ---------------------<br>&gt;&gt; Luis Ibanez wrote:<br>

&gt;&gt;<br>&gt;&gt;&gt;&nbsp;&nbsp;This is a known behavior of the Histogram.<br>&gt;&gt;&gt;&nbsp;&nbsp;The correct way to use the histogram class for an image of 8-bits<br>&gt;&gt;&gt; is to set the minimum and maximum to values such as -
0.5 and 255.5<br>&gt;&gt;&gt;&nbsp;&nbsp;Note that the types for setting min and max are not the image pixel<br>&gt;&gt;&gt; type but its RealType.<br>&gt;&gt;&gt;&nbsp;&nbsp;The reason is that the min and max that we pass to the histogram<br>

&gt;&gt;&gt; class are the values for the min of the first bin and the max of<br>&gt;&gt;&gt; the last bin.<br>&gt;&gt;&gt;&nbsp;&nbsp;If you want to include all the samples, the min value of the bin<br>&gt;&gt;&gt; bounds must be lower that the actual minimum value expected in the
<br>&gt;&gt;&gt; population, and the max value of the bin bounds must be larger<br>&gt;&gt;&gt; than the minimum value expected in the population.&nbsp;&nbsp;This is standard<br>&gt;&gt;&gt; for computing histogram.<br>&gt;&gt;&gt;&nbsp;&nbsp;The unfortunate fact is that there are too many bad habits acquired
<br>&gt;&gt;&gt; for people that got used to work only with 8-bit images, and expect<br>&gt;&gt;&gt; the min and max of the histogram to be 0 and 255. Those are actually<br>&gt;&gt;&gt; the mid-values of the bins, not the bounds of the bins.
<br>&gt;&gt;&gt;&nbsp;&nbsp;It may be convenient to have a helper initializer class to set the<br>&gt;&gt;&gt; min and max values for images of (char) and (unsigned char) so that<br>&gt;&gt;&gt; user's do not have to think about these details.
<br>&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Luis<br>&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;=========================<br>&gt;&gt;&gt; Karthik Krishnan wrote:<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; The histogram class is a widely used class. Please file a bug<br>&gt;&gt;&gt;&gt; report&nbsp;&nbsp;and assign it to me with a high priority.
<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; -----<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; That said, I am surprised, it does not handle pixels with<br>&gt;&gt;&gt;&gt; intensity&nbsp;&nbsp;255. See lines 90-102 of<br>&gt;&gt;&gt;&gt; 
<a href="http://www.itk.org/cgi-bin/viewcvs.cgi/Code/Numerics/Statistics/itkListSampleToHistogramGenerator.txx?annotate=1.14&amp;root=Insight" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://www.itk.org/cgi-bin/viewcvs.cgi/Code/Numerics/Statistics/itkListSampleToHistogramGenerator.txx?annotate=1.14&amp;root=Insight
</a><br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h_upper[i] = ((THistogramMeasurement) upper[i]) +<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumericTraits&lt; THistogramMeasurement &gt;::One ;<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(h_upper[i] &lt;= upper[i])<br>

&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// an overflow has occurred therefore set upper to upper<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h_upper[i] = upper[i];<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Histogram measurement type would force the clipping
<br>&gt;&gt;&gt;&gt; the&nbsp;&nbsp;max value.<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Therefore we must call the following to include the<br>&gt;&gt;&gt;&gt; max&nbsp;&nbsp;value:<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_Histogram-&gt;SetClipBinsAtEnds(false);
<br>&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; If pixel type is UCHAR, it should go into that if block and do the<br>&gt;&gt;&gt;&gt; SetClipBinsAtEnds(false) thing. That would mean that the bins at
<br>&gt;&gt;&gt;&gt; the&nbsp;&nbsp;edges of the histogram extend to infinity, so really 255<br>&gt;&gt;&gt;&gt; should be&nbsp;&nbsp;considered.&nbsp;&nbsp; [ In the default case, the ends are<br>&gt;&gt;&gt;&gt; clipped, See&nbsp;&nbsp;constructor of itk::Histogram with sets
<br>&gt;&gt;&gt;&gt; ClipBinsAtEnds to true (so 255&nbsp;&nbsp;won't be considered), but that's<br>&gt;&gt;&gt;&gt; not the case with you since you are&nbsp;&nbsp;using the<br>&gt;&gt;&gt;&gt; ScalarImageToHistogramGenerator.&nbsp;&nbsp;]<br>&gt;&gt;&gt;&gt;
<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; Thanks for reporting this.<br>&gt;&gt;&gt;&gt; -karthik<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; Gaetan Lehmann wrote:<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;
<br>&gt;&gt;&gt;&gt;&gt; Hi,<br>&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt; I am the only one to have this problem ?<br>&gt;&gt;&gt;&gt;&gt; Should I file a bug report ?<br>&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt; Gaetan
<br>&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt; On Fri, 02 Jun 2006 17:11:45 +0200, Gaetan Lehmann<br>&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:gaetan.lehmann@jouy.inra.fr" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
gaetan.lehmann@jouy.inra.fr
</a>&gt; wrote:<br>&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt; I forgot to say I'm using ITK 2.6.0 with gcc 4.0<br>&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt; On Fri, 02 Jun 2006 16:23:25 +0200, Gaetan Lehmann
<br>&gt;&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:gaetan.lehmann@jouy.inra.fr" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">gaetan.lehmann@jouy.inra.fr</a>&gt; wrote:<br>&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; Hi,<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;
<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; I'm trying to manipulate histograms, with itk::Histogram. I'm<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; generating<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; the histogram from an image with the<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; ScalarImageToHistogramGenerator
<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; class. The pixel type of the input image is unsigned char.<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; Everything seems to work, as long as there is no pixel value =<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; 255&nbsp;&nbsp;in&nbsp;&nbsp;the
<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; image.<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; All the pixels with an intensity of 255 are not counted in the<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; histogram.<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; For example, the attached image (a 10x10 black image with 4
<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; white&nbsp;&nbsp;(255)<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; pixels) produce an histogram with 96 pixels according to the<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; GetTotalFrequency() result.<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;
<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; Is it a bug ?<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; Or I have missed something ?<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; Regards,<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt; Gaetan
<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; _______________________________________________
<br>&gt;&gt;&gt;&gt; Insight-users mailing list<br>&gt;&gt;&gt;&gt; <a href="mailto:Insight-users@itk.org" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">Insight-users@itk.org</a><br>&gt;&gt;&gt;&gt; 
<a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://www.itk.org/mailman/listinfo/insight-users
</a><br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&nbsp;&nbsp; _______________________________________________<br>&gt;&gt;&gt; Insight-developers mailing list<br>&gt;&gt;&gt; <a href="mailto:Insight-developers@itk.org" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
Insight-developers@itk.org
</a><br>&gt;&gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-developers" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://www.itk.org/mailman/listinfo/insight-developers</a><br>&gt;&gt;&gt;
<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; _______________________________________________
<br>&gt;&gt; Insight-users mailing list<br>&gt;&gt; <a href="mailto:Insight-users@itk.org" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">Insight-users@itk.org</a><br>&gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://www.itk.org/mailman/listinfo/insight-users
</a><br>&gt;<br>&gt;<br>&gt;<br>&gt;<br>_______________________________________________<br>Insight-developers mailing list<br><a href="mailto:Insight-developers@itk.org" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
Insight-developers@itk.org</a><br><a href="http://www.itk.org/mailman/listinfo/insight-developers" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://www.itk.org/mailman/listinfo/insight-developers</a><br></blockquote></div><br>

</span></div></blockquote></div><br>