<br>Hi Luis et al.,<br><br>I&#39;ve created the input images by exporting from Photoshop with a defined background value (RGB: 0 0 0).  It&#39;s these values that I want to exclude from the metric in the image registration method.<br>
<br>The min color is confirmed by the identify program of ImageMagick:<br><br>  Colorspace: RGB<br>  Depth: 16-bit<br>  Channel depth:<br>    gray: 16-bit<br>  Channel statistics:<br>    Gray:<br>      min: 0 (0)<br>      max: 46335 (0.707027)<br>
      mean: 25664.6 (0.391617)<br>      standard deviation: 15257.7 (0.232818)<br>      kurtosis: -0.857968<br>      skewness: -0.771191<br><br><br>TIA,<br>Darren<br><br><br><br><div class="gmail_quote">On Tue, Mar 16, 2010 at 10:25 AM, Luis Ibanez <span dir="ltr">&lt;<a href="mailto:luis.ibanez@kitware.com">luis.ibanez@kitware.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Hi Darren,<br>
<br>
1) As described in the ITK Software Guide<br>
<br>
         <a href="http://www.itk.org/ItkSoftwareGuide.pdf" target="_blank">http://www.itk.org/ItkSoftwareGuide.pdf</a><br>
<br>
   in the Chapter 7 &quot;Reading and Writing Images&quot;,<br>
   in section 7.1, pdf-page: 296:<br>
<br>
  ITK takes the pixel data from the input file and casts it to<br>
  the PixelType that you used for instantiating your image<br>
  at compilation time. The casting is performed using<br>
  C-Language rules, and not truncation, overflow or underflow<br>
  detection, nor scaling is applied.<br>
<br>
  So, if your TIFF file contains 16bit integers values per pixel<br>
  and you instantiate the image using a &quot;float&quot; pixel type, then<br>
  the values of the integers will be casted (without any rescaling)<br>
  in to floats.<br>
<br>
<br>
2)  If you have a use for the original &quot;16bits&quot; data, then it may<br>
     be worth reading the file in an image of the exact same type<br>
     and then using a CastImageFilter to convert it to float.<br>
<br>
     On the other hand, if you only need the float image for<br>
     performing the registration, then reading directly into a<br>
     float image is actually saving you some memory.<br>
<br>
3)   &quot;Black&quot; pixels is quite an ambiguous measure, since,<br>
     depending on the image viewer that you are using, it may<br>
     well be that what you &quot;see&quot; as black, is actually a level<br>
     of intensity with values around 20,000 (for example).<br>
<br>
     What you really need is a sort of histogram that will allow<br>
     you to identify the background of the image,<br>
<br>
     or<br>
<br>
     A visualization method that allows you to identify the<br>
     intensity level of the background.<br>
<br>
     You may want to consider:<br>
<br>
       Insight/Code/Algorithms/<br>
                        itkOtsuThresholdImageCalculator.h<br>
<br>
     and the Insight Journal papers:<br>
<br>
     &quot;Kappa Sigma Clipping&quot;<br>
     <a href="http://www.insight-journal.org/browse/publication/132" target="_blank">http://www.insight-journal.org/browse/publication/132</a><br>
     <a href="http://hdl.handle.net/1926/367" target="_blank">http://hdl.handle.net/1926/367</a><br>
<br>
     &quot;Robust Automatic Threshold Selection&quot;<br>
     <a href="http://www.insight-journal.org/browse/publication/134" target="_blank">http://www.insight-journal.org/browse/publication/134</a><br>
     <a href="http://hdl.handle.net/1926/370" target="_blank">http://hdl.handle.net/1926/370</a><br>
<br>
     as options for estimating a suitable threshold.<br>
<br>
<br>
<br>
<br>
   Regards,<br>
<br>
<br>
         Luis<br>
<br>
<br>
<br>
----------------------------------------------------------------<br>
On Mon, Mar 15, 2010 at 3:09 PM, Darren Weber<br>
<div><div></div><div class="h5">&lt;<a href="mailto:darren.weber.lists@gmail.com">darren.weber.lists@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi Luis et al.,<br>
&gt;<br>
&gt; Now the ITK library is compiled and installed with the additional features<br>
&gt; available.  Now this code will compile:<br>
&gt;<br>
&gt; typedef itk::MeanSquaresImageToImageMetric&lt;iBWImgType,iBWImgType&gt;<br>
&gt; MetricType;<br>
&gt; MetricType::Pointer metric = MetricType::New();<br>
&gt; metric-&gt;SetUseFixedImageSamplesIntensityThreshold( true );<br>
&gt; metric-&gt;SetFixedImageSamplesIntensityThreshold( intensityThreshold );<br>
&gt; //metric-&gt;SetUseSequentialSampling( true );<br>
&gt; //metric-&gt;SetUseAllPixels( true );<br>
&gt;<br>
&gt;<br>
&gt; Now a question arises about the range of values for the<br>
&gt; &quot;intensityThreshold&quot;.  The input pixel and image typedefs are:<br>
&gt;<br>
&gt; const unsigned short dimImg = 2;<br>
&gt; typedef float iPixType;<br>
&gt; typedef itk::Image&lt; iPixType, dimImg &gt; iBWImgType;<br>
&gt; typedef itk::ImageFileReader&lt; iBWImgType &gt; bwImageReaderType;<br>
&gt;<br>
&gt;<br>
&gt; The image reader is pulling in .tif images, which ImageMagick identifies as<br>
&gt; (see verbose output in attachment):<br>
&gt;<br>
&gt; $  identify testdata/bw/section0003_w1.tif<br>
&gt; testdata/bw/section0003_w1.tif TIFF 549x539 549x539+0+0 16-bit Grayscale<br>
&gt; DirectClass 615KB 0.010u 0:00.030<br>
&gt;<br>
&gt; When this image is read into the iPixType, I assume the range of these<br>
&gt; &quot;unsigned short&quot; values is mapped or cast into a range of &quot;float&quot; values.<br>
&gt; Is the new range of values from 0.0 to 1.0, is that correct for the &quot;float&quot;<br>
&gt; pixel type in ITK?  How does the ITK image reader convert or cast the pixel<br>
&gt; values to float?  (The reason the input images are specified as &quot;float&quot;<br>
&gt; rather than &quot;unsigned short&quot; is to have them input to the registration<br>
&gt; method as floats - should this be done with an explicit cast filter?)<br>
&gt;<br>
&gt; The input images have a black background (RGB value: 0 0 0).  It would be<br>
&gt; great to threshold the MeanSquaresImageToImageMetric to exclude all the<br>
&gt; black pixels.  In the range of values for the input pixel data that are an<br>
&gt; unsigned short (0 to 65535), any pixel above 0 would be<br>
&gt;<br>
&gt; unsigned short intensityThreshold = 1;<br>
&gt;<br>
&gt; However, the intensityThreshold is declared and initialized as:<br>
&gt;<br>
&gt; iBWImgType::PixelType intensityThreshold = 0.0;<br>
&gt;<br>
&gt; Is this a reasonable value for this float intensityThreshold:<br>
&gt;<br>
&gt; iBWImgType::PixelType intensityThreshold = 1.0 / USHRT_MAX;<br>
&gt;<br>
&gt;<br>
&gt; TIA,<br>
&gt; Darren<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Sat, Mar 6, 2010 at 12:15 PM, Luis Ibanez &lt;<a href="mailto:luis.ibanez@kitware.com">luis.ibanez@kitware.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hi Darren,<br>
&gt;&gt;<br>
&gt;&gt; The feature that you are referring to, is only available<br>
&gt;&gt; in the new version of the metrics that are in the<br>
&gt;&gt; Code/Review directory.<br>
&gt;&gt;<br>
&gt;&gt; In order to use this classes you must reconfigure your<br>
&gt;&gt; binary build of ITK, by rerunning CMake and turning<br>
&gt;&gt; ON the CMake variables:<br>
&gt;&gt;<br>
&gt;&gt;   *  ITK_USE_REVIEW<br>
&gt;&gt;   *  OPTIMIZED_REGISTRATION_METHODS<br>
&gt;&gt;<br>
&gt;&gt; Then you can rebuild your application.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;     Regards,<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;            Luis<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; -----------------------------------------------------------------------------------<br>
&gt;&gt; On Thu, Mar 4, 2010 at 5:56 PM, Darren Weber<br>
&gt;&gt; &lt;<a href="mailto:darren.weber.lists@gmail.com">darren.weber.lists@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; In an image registration framework, the metric determines image<br>
&gt;&gt; &gt; &quot;matches&quot;.<br>
&gt;&gt; &gt; Let&#39;s suppose we have large images that contain a majority of background<br>
&gt;&gt; &gt; color (or transparency).  In a metric like the<br>
&gt;&gt; &gt; itk::MeanSquaresImageToImageMetric, the majority of the<br>
&gt;&gt; &gt; sqaured-diff-values<br>
&gt;&gt; &gt; would be zero and the remainder of the &quot;relevant&quot; pixel differences may<br>
&gt;&gt; &gt; be<br>
&gt;&gt; &gt; &quot;swamped&quot; or &quot;lost&quot; in the division by a large N.<br>
&gt;&gt; &gt; Also, it appears the default metric sampling is a random-sample of the<br>
&gt;&gt; &gt; image<br>
&gt;&gt; &gt; pixels (this might be modified with methods like<br>
&gt;&gt; &gt; &quot;SetUseAllPixels(bool)&quot;).<br>
&gt;&gt; &gt;  In this case, it is possible, perhaps likely, that few of the<br>
&gt;&gt; &gt; &quot;relevant&quot;<br>
&gt;&gt; &gt; pixels will be evaluated in the metric.<br>
&gt;&gt; &gt; See:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; <a href="http://www.itk.org/Doxygen316/html/classitk_1_1ImageToImageMetric.html#42b876134388099afbf34b14faf83cdb" target="_blank">http://www.itk.org/Doxygen316/html/classitk_1_1ImageToImageMetric.html#42b876134388099afbf34b14faf83cdb</a><br>

&gt;&gt; &gt; This documentation suggests there are also options to define:<br>
&gt;&gt; &gt; IntensityThreshold, Masks, and SequentialSampling<br>
&gt;&gt; &gt; In my reading of the doxy page (see next link), there is a method called<br>
&gt;&gt; &gt; &quot;SetFixedImageSamplesIntensityThreshold&quot; that might be useful to define<br>
&gt;&gt; &gt; a<br>
&gt;&gt; &gt; background value (like zero) to be excluded from the metric.  Is that<br>
&gt;&gt; &gt; right?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; <a href="http://www.itk.org/Doxygen316/html/classitk_1_1MeanSquaresImageToImageMetric-members.html" target="_blank">http://www.itk.org/Doxygen316/html/classitk_1_1MeanSquaresImageToImageMetric-members.html</a><br>

&gt;&gt; &gt; What is the logic of this &quot;threshold&quot; method?  From the documentation,<br>
&gt;&gt; &gt; it<br>
&gt;&gt; &gt; appears to be a minima value.  So if the background intensity is zero,<br>
&gt;&gt; &gt; the<br>
&gt;&gt; &gt; threshold value of 1 would include all pixels &gt; 0 (note the threshold<br>
&gt;&gt; &gt; value<br>
&gt;&gt; &gt; must be the same type as the fixed image PixelType).<br>
&gt;&gt; &gt; There is no equivalent method for the moving image,<br>
&gt;&gt; &gt; like &quot;SetMovingImageSamplesIntensityThreshold&quot;.  Is this unnecessary<br>
&gt;&gt; &gt; because<br>
&gt;&gt; &gt; the metric only scans the pixels of the moving image that fall within<br>
&gt;&gt; &gt; the<br>
&gt;&gt; &gt; &quot;domain&quot; of fixed image after the transform &amp; interpolation?<br>
&gt;&gt; &gt; I could not locate this method in the class hierarchy - is it available<br>
&gt;&gt; &gt; (inherited) in all metrics?<br>
&gt;&gt; &gt; I&#39;m confused because these methods do not appear to be available<br>
&gt;&gt; &gt; to itk::MeanSquaresImageToImageMetric<br>
&gt;&gt; &gt; e.g.:  CODE:<br>
&gt;&gt; &gt;     typedef itk::MeanSquaresImageToImageMetric&lt; iBWImgType, iBWImgType &gt;<br>
&gt;&gt; &gt; MetricType;<br>
&gt;&gt; &gt;     MetricType::Pointer metric = MetricType::New();<br>
&gt;&gt; &gt;     metric-&gt;SetFixedImageSamplesIntensityThreshold( 0.0 );<br>
&gt;&gt; &gt;     metric-&gt;SetUseAllPixels( true );<br>
&gt;&gt; &gt; e.g.:  COMPILATION:<br>
&gt;&gt; &gt; itkImageRigid2DCoregistration.cxx: In function ‘int main(int, char**)’:<br>
&gt;&gt; &gt; itkImageRigid2DCoregistration.cxx:442: error: ‘class<br>
&gt;&gt; &gt; itk::MeanSquaresImageToImageMetric&lt;iBWImgType, iBWImgType&gt;’ has no<br>
&gt;&gt; &gt; member<br>
&gt;&gt; &gt; named ‘SetFixedImageSamplesIntensityThreshold’<br>
&gt;&gt; &gt; itkImageRigid2DCoregistration.cxx:443: error: ‘class<br>
&gt;&gt; &gt; itk::MeanSquaresImageToImageMetric&lt;iBWImgType, iBWImgType&gt;’ has no<br>
&gt;&gt; &gt; member<br>
&gt;&gt; &gt; named ‘SetUseAllPixels’<br>
&gt;&gt; &gt; gmake[2]: ***<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; [CMakeFiles/itkImageRigid2DCoregistration.dir/itkImageRigid2DCoregistration.cxx.o]<br>
&gt;&gt; &gt; Error 1<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; TIA,<br>
&gt;&gt; &gt; Darren<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _____________________________________<br>
&gt;&gt; &gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt;&gt; &gt; <a href="http://www.kitware.com/products/protraining.html" target="_blank">http://www.kitware.com/products/protraining.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; &gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div><br>