[Insight-users] map the colours from the eigenvector
alba garin
albagarin1986 at hotmail.com
Mon Feb 21 10:57:12 EST 2011
Hi Seth,thanks a lot for your piece of code, I use it combined with mine and now it works! :) thanks a lot!
From: seth at mech.ubc.ca
Date: Wed, 16 Feb 2011 09:31:15 -0800
Subject: Re: [Insight-users] map the colours from the eigenvector
To: albagarin1986 at hotmail.com
CC: insight-users at itk.org
Hey Alba,
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.
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).
This is purely for visualization - I would not normalize your tensor data.
Cheers,
Seth
On Tue, Feb 15, 2011 at 2:54 AM, alba garin <albagarin1986 at hotmail.com> wrote:
Hi Seth,why should i need to find the maximum and minimum pixel values and then normalize the vector pixel components by these values?
in my case i iterate through a image of tensors, with the pixel type being a DiffusionTensor3D. should i do it as well?
Thanks and sorry for my ignorance, im a beginner :(
From: seth at mech.ubc.ca
Date: Mon, 14 Feb 2011 15:50:38 -0800
Subject: Re: [Insight-users] map the colours from the eigenvector
To: albagarin1986 at hotmail.com
CC: insight-users at itk.org
Hi Alba,
A program I wrote which I think should do something like you want is below. I'm working in Linux, but it should compile for you.
#include <iostream>
#include <stdlib.h>
#include "itkVector.h"
#include "itkImage.h"
#include "itkImageFileWriter.h"
#include "itkRGBPixel.h"
#include "itkImageRegionIterator.h"
#include <time.h>
#include <limits>
int main(int argc, char** argv)
{
if ( argc < 2 || argc > 2){ //Check for correct number of inputs
std::cout<<"Usage:"<<std::endl;
std::cout<<argv[0]<<" [Output File Name] "<<std::endl<<std::endl;
return EXIT_FAILURE;
}
/* Create the Images.*/
typedef double VectorComponentType;
typedef unsigned short RGBComponentType; // many image formats have limited pixel types
typedef itk::Vector< VectorComponentType, 3> VectorPixelType;
typedef itk::RGBPixel< RGBComponentType > RGBPixelType;
typedef itk::Image< VectorPixelType, 3 > VectorImageType;
typedef itk::Image< RGBPixelType, 3 > RGBImageType;
VectorImageType::RegionType region;
VectorImageType::RegionType::SizeType regionSize;
VectorImageType::RegionType::IndexType regionStart;
VectorImageType::PointType origin;
VectorImageType::SpacingType spacing;
regionSize[0] = 100;
regionSize[1] = 100;
regionSize[2] = 100;
regionStart[0] = 0;
regionStart[1] = 0;
regionStart[2] = 0;
region.SetSize(regionSize);
region.SetIndex(regionStart);
origin[0] = 0;
origin[1] = 0;
origin[2] = 0;
spacing[0] = 1;
spacing[1] = 1;
spacing[2] = 1;
VectorImageType::Pointer vectorIm = VectorImageType::New();
RGBImageType::Pointer rgbIm = RGBImageType::New();
vectorIm->SetRegions(region);
vectorIm->SetOrigin(origin);
vectorIm->SetSpacing(spacing);
rgbIm->SetRegions(region);
rgbIm->SetOrigin(origin);
rgbIm->SetSpacing(spacing);
vectorIm->Allocate();
rgbIm->Allocate();
/*Create the Iterators */
typedef itk::ImageRegionIterator< VectorImageType > VectorIteratorType;
typedef itk::ImageRegionIterator< RGBImageType > RGBIteratorType;
VectorIteratorType vIt(vectorIm, vectorIm->GetLargestPossibleRegion() );
RGBIteratorType cIt(rgbIm, vectorIm->GetLargestPossibleRegion() );
/* Let's fill the vector image with random numbers between -1 and 1 */
srand( time(NULL) );
for( vIt.GoToBegin(); !vIt.IsAtEnd(); ++vIt ){
VectorPixelType setPixel;
setPixel[0] = (VectorComponentType) rand()/RAND_MAX; // Random value
setPixel[1] = (VectorComponentType) rand()/RAND_MAX;
setPixel[2] = (VectorComponentType) rand()/RAND_MAX;
setPixel[0] = rand() > RAND_MAX/2 ? setPixel[0] : -1 * setPixel[0]; //Randomly +'ve or -'ve
setPixel[1] = rand() > RAND_MAX/2 ? setPixel[1] : -1 * setPixel[1];
setPixel[2] = rand() > RAND_MAX/2 ? setPixel[2] : -1 * setPixel[2];
vIt.Set(setPixel);
}
/* Here you might need to find the maximum and minimum pixel values
* and then normalize the vector pixel components by these values.
* Presumably your vectors are unit vectors so it is likely that the max and
* min values are -1 and 1, but I don't know. */
for( cIt.GoToBegin(), vIt.GoToBegin(); !vIt.IsAtEnd(); ++cIt, ++vIt ){
VectorPixelType getPixel;
getPixel = vIt.Get();
RGBPixelType rgbPixel; // since abs(values) of vector are 0-1, multiply by RGB pixel max
rgbPixel[0] = std::numeric_limits< RGBComponentType >::max() * fabs (getPixel[0]);
rgbPixel[1] = std::numeric_limits< RGBComponentType >::max() * fabs (getPixel[1]);
rgbPixel[2] = std::numeric_limits< RGBComponentType >::max() * fabs (getPixel[2]);
cIt.Set(rgbPixel);
}
typedef itk::ImageFileWriter< RGBImageType > RGBWriterType;
RGBWriterType::Pointer writer = RGBWriterType::New();
writer->SetInput( rgbIm );
std::string fileName = argv[1];
writer->SetFileName( fileName );
writer->Update();
return 0;
}
On Mon, Feb 14, 2011 at 8:42 AM, alba garin <albagarin1986 at hotmail.com> wrote:
Hello Seth
the error is "Unhandled exception at 0x012cb166 in tesImageReaderExample.exe: 0xC0000094: Integer division by zero." now in doing like this
<code> rgb.SetRed(x); rgb.SetGreen(y);
rgb.SetBlue(z); indexIt=itRGB.GetIndex(); rgbImage->SetPixel(indexIt,rgb);
</code>but first i tried like this<code> rgb.SetRed(x);
rgb.SetGreen(y);
rgb.SetBlue(z); itRGB.Set(rgb);</code>
where rgb is itk::RGBPixel<double>, x,y and z are the values extracted from the eigenvector, itRGB is the iterator that goes through the itk::Image<RGBPixelType,3>.
thanks,
From: seth at mech.ubc.ca
Date: Mon, 14 Feb 2011 08:14:57 -0800
Subject: Re: [Insight-users] map the colours from the eigenvector
To: albagarin1986 at hotmail.com
CC: insight-users at itk.org
Hi alba,
What's the error?
Seth
On Mon, Feb 14, 2011 at 3:09 AM, alba garin <albagarin1986 at hotmail.com> wrote:
Hi again,
the problem is that i got an error at doing itRGB.Set(rgbPixel).why is that happening?Thanks,
From: albagarin1986 at hotmail.com
To: seth at mech.ubc.ca; insight-users at itk.org
Date: Mon, 14 Feb 2011 07:52:29 +0000
Subject: Re: [Insight-users] map the colours from the eigenvector
Thanks, I needed to save each component in RGB pixels so your pseudo code is useful.
From: seth at mech.ubc.ca
Date: Fri, 11 Feb 2011 13:25:25 -0800
Subject: [Insight-users] map the colours from the eigenvector
To: insight-users at itk.org; albagarin1986 at hotmail.com
Hi Alba,
I'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!
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).
RBGIteratorType itRGB(rbgImage, vectorImage->GetLargestPossibleRegion());
ConstVectorIteratorType constItVec(vectorImage, vectorImage->GetLargestPossibleRegion());
for ([the whole region])
{
VectorImageType::PixelType currentVectorPixel = constItVec.Get();
RGBImageType::PixelType currentRGBPixel;
currentRGBPixel->SetBlue(currentVectorPixel[0]); // make sure your vector component type and pixel type match
currentRGBPixel->SetGreen(currentVectorPixel[1]); // you will also want to normalize your vector components by the largest in the image.
currentRGBPixel->SetRed(currentVectorPixel[2]);
itRGB.Set(currentRGBPixel);
}
_____________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Kitware offers ITK Training Courses, for more information visit:
http://www.kitware.com/products/protraining.html
Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ
Follow this link to subscribe/unsubscribe:
http://www.itk.org/mailman/listinfo/insight-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20110221/fd20fadd/attachment-0001.htm>
More information about the Insight-users
mailing list