Hey Alba,<br>Normalizing by the largest value is just to make sure that you use the full range of colours to visualize your data set (similar to rescaling a colour map to fit your data in MatLab (see imagesc function) or ParaView).  If, for example, your vectors were mostly along the z-axis (blue channel) with only small deviations in the x-direction (red channel) - say the x component ranged from 0 to 0.1 - it would be hard to see this in the image because the red channel would at most be only 10% on.  If you normalize by the 0.1 and make it so that 0.1 in x turns the red channel all the way on you would be able to see the changes in x-flow with much more precision. <br>

<br>Also, the code I have below uses the absolute value of the vector component, so colour is proportional component magnitude (flow represented by (-1,0,0) will be the same colour as (1,0,0)), if you want directions to show in the colours, you will have to set (0,0,0) to use the colour (numeric_limits::max/2, numeric_limits::max/2, numeric_limits::max/2).<br>

<br>This is purely for visualization - I would not normalize your tensor data.<br><br>Cheers,<br>Seth<br><br><div class="gmail_quote">On Tue, Feb 15, 2011 at 2:54 AM, alba garin <span dir="ltr">&lt;<a href="mailto:albagarin1986@hotmail.com">albagarin1986@hotmail.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;">



<div>
<font face="Tahoma">Hi Seth,</font><div style="font-family: Tahoma;">why should i need to <span style="color: rgb(42, 42, 42); font-family: &#39;Segoe UI&#39;,Tahoma,Verdana,Arial,sans-serif;">find the maximum and minimum pixel values and then normalize the vector pixel components by these values? </span></div>

<div><font color="#2a2a2a" face="&#39;Segoe UI&#39;, Tahoma, Verdana, Arial, sans-serif">in my case i iterate through a image of tensors, with the pixel type being a DiffusionTensor3D. should i do it as well?</font></div>

<div><font color="#2a2a2a" face="&#39;Segoe UI&#39;, Tahoma, Verdana, Arial, sans-serif">Thanks and sorry for my ignorance, im a beginner :( </font></div><div><div class="im"><div style="font-family: Tahoma;">
<p align="center"><font color="#000000"><img src="https://mail.google.com/mail/?ui=2&amp;view=bsp&amp;ver=ohhl4rw8mbn4" height="2" vspace="9" width="100%"></font></p></div><br><br><br><br><div style="font-family: Tahoma;">

</div><hr style="font-family: Tahoma;"><font face="Tahoma">From: <a href="mailto:seth@mech.ubc.ca" target="_blank">seth@mech.ubc.ca</a></font><br></div><font face="Tahoma">Date: Mon, 14 Feb 2011 15:50:38 -0800</font><div>

<div></div><div class="h5"><br><font face="Tahoma">Subject: Re: [Insight-users] map the colours from the eigenvector</font><br><font face="Tahoma">To: <a href="mailto:albagarin1986@hotmail.com" target="_blank">albagarin1986@hotmail.com</a></font><br>

<font face="Tahoma">CC: <a href="mailto:insight-users@itk.org" target="_blank">insight-users@itk.org</a></font><br><br><font face="Tahoma">Hi Alba,</font><br><font face="Tahoma">A program I wrote which I think should do something like you want is below.  I&#39;m working in Linux, but it should compile for you.</font><br>

<br><font face="Tahoma">#include &lt;iostream&gt;</font><br><font face="Tahoma">#include &lt;stdlib.h&gt;</font><br><font face="Tahoma">#include &quot;itkVector.h&quot;</font><br><font face="Tahoma">


#include &quot;itkImage.h&quot;</font><br><font face="Tahoma">#include &quot;itkImageFileWriter.h&quot;</font><br><font face="Tahoma">#include &quot;itkRGBPixel.h&quot;</font><br><font face="Tahoma">#include &quot;itkImageRegionIterator.h&quot;</font><br>

<font face="Tahoma">#include &lt;time.h&gt;</font><br><font face="Tahoma">#include &lt;limits&gt;</font><br>


<br><font face="Tahoma">int main(int argc, char** argv)</font><br><font face="Tahoma">{</font><br><font face="Tahoma">    if ( argc &lt; 2 || argc &gt; 2){ //Check for correct number of inputs</font><br><font face="Tahoma">        std::cout&lt;&lt;&quot;Usage:&quot;&lt;&lt;std::endl;</font><br>

<font face="Tahoma">        std::cout&lt;&lt;argv[0]&lt;&lt;&quot; [Output File Name] &quot;&lt;&lt;std::endl&lt;&lt;std::endl;</font><br><font face="Tahoma">


        return EXIT_FAILURE;</font><br><font face="Tahoma">    }</font><br><font face="Tahoma">    /* Create the Images.*/</font><br><font face="Tahoma">    typedef double    VectorComponentType;</font><br><font face="Tahoma">    typedef unsigned short    RGBComponentType; // many image formats have limited pixel types</font><br>

<font face="Tahoma">    typedef itk::Vector&lt; VectorComponentType, 3&gt;    VectorPixelType;</font><br><font face="Tahoma">


    typedef itk::RGBPixel&lt; RGBComponentType &gt;        RGBPixelType;</font><br><font face="Tahoma">    </font><br><font face="Tahoma">    typedef itk::Image&lt; VectorPixelType, 3 &gt;        VectorImageType;</font><br>

<font face="Tahoma">    typedef itk::Image&lt; RGBPixelType, 3 &gt;            RGBImageType;</font><br><font face="Tahoma">


    </font><br><font face="Tahoma">    VectorImageType::RegionType                region;</font><br><font face="Tahoma">    VectorImageType::RegionType::SizeType    regionSize;</font><br><font face="Tahoma">    VectorImageType::RegionType::IndexType  regionStart;</font><br>

<font face="Tahoma">    VectorImageType::PointType                origin;</font><br><font face="Tahoma">


    VectorImageType::SpacingType            spacing;</font><br><font face="Tahoma">    </font><br><font face="Tahoma">    regionSize[0] = 100;</font><br><font face="Tahoma">    regionSize[1] = 100;</font><br><font face="Tahoma">    regionSize[2] = 100;</font><br>

<font face="Tahoma">    regionStart[0] = 0;</font><br><font face="Tahoma">    regionStart[1] = 0;</font><br><font face="Tahoma">    regionStart[2] = 0;</font><br><font face="Tahoma">


    region.SetSize(regionSize);</font><br><font face="Tahoma">    region.SetIndex(regionStart);</font><br><font face="Tahoma">    origin[0] = 0;</font><br><font face="Tahoma">    origin[1] = 0;</font><br><font face="Tahoma">    origin[2] = 0;</font><br>

<font face="Tahoma">    spacing[0] = 1;</font><br><font face="Tahoma">    spacing[1] = 1;</font><br><font face="Tahoma">    spacing[2] = 1;</font><br><font face="Tahoma">    </font><br><font face="Tahoma">    VectorImageType::Pointer    vectorIm = VectorImageType::New();</font><br>

<font face="Tahoma">


    RGBImageType::Pointer        rgbIm = RGBImageType::New();</font><br><font face="Tahoma">    </font><br><font face="Tahoma">    vectorIm-&gt;SetRegions(region);</font><br><font face="Tahoma">    vectorIm-&gt;SetOrigin(origin);</font><br>

<font face="Tahoma">    vectorIm-&gt;SetSpacing(spacing);</font><br><font face="Tahoma">    rgbIm-&gt;SetRegions(region);</font><br><font face="Tahoma">


    rgbIm-&gt;SetOrigin(origin);</font><br><font face="Tahoma">    rgbIm-&gt;SetSpacing(spacing);</font><br><font face="Tahoma">    </font><br><font face="Tahoma">    vectorIm-&gt;Allocate();</font><br><font face="Tahoma">    rgbIm-&gt;Allocate();</font><br>

<font face="Tahoma">    </font><br><font face="Tahoma">    /*Create the Iterators */</font><br><font face="Tahoma">    typedef itk::ImageRegionIterator&lt; VectorImageType &gt;    VectorIteratorType;</font><br><font face="Tahoma">


    typedef itk::ImageRegionIterator&lt; RGBImageType &gt;    RGBIteratorType;</font><br><font face="Tahoma">    </font><br><font face="Tahoma">    VectorIteratorType    vIt(vectorIm, vectorIm-&gt;GetLargestPossibleRegion() );</font><br>

<font face="Tahoma">    RGBIteratorType        cIt(rgbIm, vectorIm-&gt;GetLargestPossibleRegion() );</font><br><font face="Tahoma">


    </font><br><font face="Tahoma">    /* Let&#39;s fill the vector image with random numbers between -1 and 1 */</font><br><font face="Tahoma">    srand( time(NULL) );</font><br><font face="Tahoma">    </font><br><font face="Tahoma">    for( vIt.GoToBegin(); !vIt.IsAtEnd(); ++vIt ){</font><br>

<font face="Tahoma">        VectorPixelType    setPixel;</font><br><font face="Tahoma">

        setPixel[0] = (VectorComponentType) rand()/RAND_MAX;  // Random value</font><br><font face="Tahoma">
        setPixel[1] = (VectorComponentType) rand()/RAND_MAX;</font><br><font face="Tahoma">        setPixel[2] = (VectorComponentType) rand()/RAND_MAX;</font><br><font face="Tahoma">        </font><br><font face="Tahoma">        setPixel[0] = rand() &gt; RAND_MAX/2 ? setPixel[0] : -1 * setPixel[0];  //Randomly +&#39;ve or -&#39;ve</font><br>

<font face="Tahoma">


        setPixel[1] = rand() &gt; RAND_MAX/2 ? setPixel[1] : -1 * setPixel[1];</font><br><font face="Tahoma">        setPixel[2] = rand() &gt; RAND_MAX/2 ? setPixel[2] : -1 * setPixel[2];</font><br><font face="Tahoma">        </font><br>

<font face="Tahoma">        vIt.Set(setPixel);</font><br><font face="Tahoma">    }</font><br><font face="Tahoma">    </font><br><font face="Tahoma">


    /* Here you might need to find the maximum and minimum pixel values</font><br><font face="Tahoma">     * and then normalize the vector pixel components by these values.</font><br><font face="Tahoma">     * Presumably your vectors are unit vectors so it is likely that the max and </font><br>

<font face="Tahoma">


     * min values are -1 and 1, but I don&#39;t know. */</font><br><font face="Tahoma">     </font><br><font face="Tahoma">    for( cIt.GoToBegin(), vIt.GoToBegin(); !vIt.IsAtEnd(); ++cIt, ++vIt ){</font><br><font face="Tahoma">        VectorPixelType getPixel;</font><br>

<font face="Tahoma">        getPixel = vIt.Get();</font><br><br><font face="Tahoma">


        RGBPixelType rgbPixel; // since abs(values) of vector are 0-1, multiply by RGB pixel max</font><br><font face="Tahoma">        rgbPixel[0] = std::numeric_limits&lt; RGBComponentType &gt;::max() * fabs (getPixel[0]);</font><br>

<font face="Tahoma">        rgbPixel[1] = std::numeric_limits&lt; RGBComponentType &gt;::max() * fabs (getPixel[1]);</font><br><font face="Tahoma">


        rgbPixel[2] = std::numeric_limits&lt; RGBComponentType &gt;::max() * fabs (getPixel[2]);</font><br><font face="Tahoma">        </font><br><font face="Tahoma">        cIt.Set(rgbPixel);</font><br><font face="Tahoma">    }</font><br>

<font face="Tahoma">    </font><br><font face="Tahoma">    typedef itk::ImageFileWriter&lt; RGBImageType &gt;    RGBWriterType;</font><br><font face="Tahoma">


    RGBWriterType::Pointer    writer = RGBWriterType::New();</font><br><font face="Tahoma">    writer-&gt;SetInput( rgbIm );</font><br><font face="Tahoma">    std::string fileName = argv[1];</font><br><font face="Tahoma">    writer-&gt;SetFileName( fileName );</font><br>

<font face="Tahoma">    </font><br><font face="Tahoma">    writer-&gt;Update();        </font><br><font face="Tahoma">


    </font><br><font face="Tahoma">    return 0;</font><br><font face="Tahoma">}</font><br><br><br><div style="font-family: Tahoma;">On Mon, Feb 14, 2011 at 8:42 AM, alba garin <span dir="ltr">&lt;<a href="mailto:albagarin1986@hotmail.com" target="_blank">albagarin1986@hotmail.com</a>&gt;</span> wrote:<br>






<blockquote style="padding-left: 1ex;">



<div>
<br><font face="Tahoma" size="2">Hello Seth</font><div style="font-family: Tahoma; font-size: 10pt;"><br></div><div><font face="Tahoma" size="2">the error is &quot;Unhandled exception at 0x012cb166 in tesImageReaderExample.exe: 0xC0000094: Integer division by zero.&quot; now in doing like this </font></div>






<div><font face="Tahoma" size="2">&lt;code&gt;</font></div><div><font face="Tahoma" size="2"><div><span style="white-space: pre-wrap;">        </span>rgb.SetRed(x);</div><div><span style="white-space: pre-wrap;">        </span>rgb.SetGreen(y);</div>






<div><span style="white-space: pre-wrap;">        </span>rgb.SetBlue(z);</div><div><div><span style="white-space: pre-wrap;">        </span>indexIt=itRGB.GetIndex();</div><div><span style="white-space: pre-wrap;">        </span>rgbImage-&gt;SetPixel(indexIt,rgb);</div>






</div></font></div><div><font face="Tahoma" size="2">&lt;/code&gt;</font></div><div><font face="Tahoma" size="2">but first i tried like this</font></div><div><font face="Tahoma" size="2">&lt;code&gt;</font></div><div><font face="Tahoma" size="2"><span style="white-space: pre-wrap;">        rgb.SetRed(x);
        rgb.SetGreen(y);
        rgb.SetBlue(z);</span></font></div><div><font face="Tahoma" size="2"><span style="white-space: pre-wrap;">        itRGB.Set(rgb);</span></font></div><div><font face="Tahoma" size="2">&lt;/code&gt;<br></font>where rgb is itk::RGBPixel&lt;double&gt;, x,y and z are the values extracted from the eigenvector, itRGB is the iterator that goes through the itk::Image&lt;RGBPixelType,3&gt;.</div>






<div>thanks,<div><br><br><br><br><div style="font-family: Tahoma; font-size: 10pt;"></div><hr style="font-family: Tahoma; font-size: 10pt;"><font face="Tahoma" size="2">From: <a href="mailto:seth@mech.ubc.ca" target="_blank">seth@mech.ubc.ca</a></font><br>






</div><font face="Tahoma" size="2">Date: Mon, 14 Feb 2011 08:14:57 -0800</font><div><br><font face="Tahoma" size="2">Subject: Re: [Insight-users] map the colours from the eigenvector</font><br></div><font face="Tahoma" size="2">To: <a href="mailto:albagarin1986@hotmail.com" target="_blank">albagarin1986@hotmail.com</a></font><br>






<font face="Tahoma" size="2">CC: <a href="mailto:insight-users@itk.org" target="_blank">insight-users@itk.org</a></font><div><div></div><div><br><br><font face="Tahoma" size="2">Hi alba,</font><br><font face="Tahoma" size="2">What&#39;s the error?</font><br>






<br><font face="Tahoma" size="2">Seth</font><br><br><div style="font-family: Tahoma; font-size: 10pt;">On Mon, Feb 14, 2011 at 3:09 AM, alba garin <span dir="ltr">&lt;<a href="mailto:albagarin1986@hotmail.com" target="_blank">albagarin1986@hotmail.com</a>&gt;</span> wrote:<br>








<blockquote style="padding-left: 1ex;">



<div>
Hi again,<div><br></div><div>the problem is that i got an error at doing itRGB.Set(rgbPixel).</div><div>why is that happening?</div><div>Thanks,</div><div><br><div>
<p align="center"><font color="#000000"><img src="https://mail.google.com/mail/?ui=2&amp;view=bsp&amp;ver=ohhl4rw8mbn4" height="2" vspace="9" width="100%"></font></p></div><br><br><br><br><hr>From: <a href="mailto:albagarin1986@hotmail.com" target="_blank">albagarin1986@hotmail.com</a><br>








To: <a href="mailto:seth@mech.ubc.ca" target="_blank">seth@mech.ubc.ca</a>; <a href="mailto:insight-users@itk.org" target="_blank">insight-users@itk.org</a><br>Date: Mon, 14 Feb 2011 07:52:29 +0000<br>Subject: Re: [Insight-users] map the colours from the eigenvector<div>








<br><br>






<br><div>Thanks, I needed to save each component in RGB pixels so your pseudo code is useful. </div><div><br>
<p align="center"><font color="#000000"><img src="https://mail.google.com/mail/?ui=2&amp;view=bsp&amp;ver=ohhl4rw8mbn4" height="2" vspace="9" width="100%"></font></p></div><br><br><br><br><hr>From: <a href="mailto:seth@mech.ubc.ca" target="_blank">seth@mech.ubc.ca</a><br>

Date: Fri, 11 Feb 2011 13:25:25 -0800<br>






Subject: [Insight-users] map the colours from the eigenvector<br>To: <a href="mailto:insight-users@itk.org" target="_blank">insight-users@itk.org</a>; <a href="mailto:albagarin1986@hotmail.com" target="_blank">albagarin1986@hotmail.com</a><br>








<br></div><div><div></div><div>Hi Alba,<br>I&#39;m not sure if I understand, is it the magnitude that you want mapped or the direction?  You can use ParaView to create visualizations of both from an image of vectors, and that my be the best way to go.  ParaView makes some very pretty pictures!<br>










<br>If you want to save each component of the vector to the components of an RGB pixel, you could use iterators to move through the image and save each component of the eigenvector to an RGB pixel as in the following pseudo code (more details in the Software Guide, page 738 on).<br>










<br>RBGIteratorType itRGB(rbgImage, vectorImage-&gt;GetLargestPossibleRegion());<br>ConstVectorIteratorType constItVec(vectorImage, vectorImage-&gt;GetLargestPossibleRegion());<br><br>for ([the whole region])<br>{<br>   VectorImageType::PixelType currentVectorPixel = constItVec.Get();<br>










   <br>   RGBImageType::PixelType currentRGBPixel;<br>   currentRGBPixel-&gt;SetBlue(currentVectorPixel[0]); // make sure your vector component type and pixel type match<br>   currentRGBPixel-&gt;SetGreen(currentVectorPixel[1]);  // you will also want to normalize your vector components by the largest in the image. <br>










   currentRGBPixel-&gt;SetRed(currentVectorPixel[2]);<br>   <br>   itRGB.Set(currentRGBPixel);<br>}<br><br><br>                                               
<br></div></div>_____________________________________
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a>

Visit other Kitware open-source projects at
<a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a>

Kitware offers ITK Training Courses, for more information visit:
<a href="http://www.kitware.com/products/protraining.html" target="_blank">http://www.kitware.com/products/protraining.html</a>

Please keep messages on-topic and check the ITK FAQ at:
<a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a>

Follow this link to subscribe/unsubscribe:
<a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a></div>                                               </div>

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