[Insight-users] 2D deformable registration
Luis Ibanez
luis.ibanez@kitware.com
Thu May 20 22:15:14 EDT 2004
Hi Ping,
You are right, the Get() method is what
should be used to retrieve the pixel
values.
It was my mistake to put (*it) in the
previous email.
Sorry about that.
---
Your test shows that the reading
of vector images may still have some
problems. We may have to reopen that
bug in the database...
Luis
----------------
ping chen wrote:
> hi Luis,
>
>
> i add your code in, but it runs into such errors,
>
> Building dependencies cmake.check_depends...
> Building object file fieldreader.o...
> /Users/Ping/Desktop/field2/fieldreader.cxx: In
> function `int main(int,
> char**)':
> /Users/Ping/Desktop/field2/fieldreader.cxx:86: error:
> no match for `*
> itk::ImageRegionIterator<DeformationFieldType>&'
> operator
> /Users/Ping/Insight/Utilities/vxl/core/vnl/vnl_transpose.h:69:
> error: candidates
> are: vnl_matrix<double> operator*(const
> vnl_matrix<double>&, const
> vnl_transpose&)
> /Users/Ping/Desktop/field2/fieldreader.cxx:87: error:
> no match for `*
> itk::ImageRegionIterator<DeformationFieldType>&'
> operator
> /Users/Ping/Insight/Utilities/vxl/core/vnl/vnl_transpose.h:69:
> error: candidates
> are: vnl_matrix<double> operator*(const
> vnl_matrix<double>&, const
> vnl_transpose&)
>
>
> the error happens where we add
> const double x = fabs( (*it)[0] );
> const double y = fabs( (*it)[1] );
>
> i dont know how to use iterator to get specific voxel
> values but that doesnt matter, instead i just use
> it.Get( ) to get all the values and save in a logfile
> so below is the code i add to the original code
>
> DeformationFieldType::Pointer fieldimage2=
> DeformationFieldType::New();
> fieldimage2 = fieldreader1->GetOutput();
>
> double maxx = 0;
> double maxy = 0;
> itk::ImageRegionIterator<
> DeformationFieldType > it( fieldimage2,
> fieldimage2->GetBufferedRegion() );
>
> it.GoToBegin();
>
> while( !it.IsAtEnd() )
> {
> // const double x = fabs( (*it)[0] );
> // const double y = fabs( (*it)[1] );
> // if( x > maxx ) maxx = x ;
> // if( y > maxy ) maxy = y ;
> std::cout << "vector values = " << it.Get( ) <<
> std::endl;
> ++it;
> }
>
> std::cout << "Max fabs X = " << maxx << std::endl;
> std::cout << "Max fabs Y = " << maxy << std::endl;
>
> and run the program as
> ./fieldreader VectorDeformationField.mhd
> BrainProtonDensitySliceBorder20.png try.img >> logfile
>
> when checking the logfile, we can see the vector
> vaules are all zeros.
>
>
> vector values = [0, 0]
> vector values = [0, 0]
> vector values = [0, 0]
> vector values = [0, 0]
> vector values = [0, 0]
> vector values = [0, 0]
>
>
> Thanks,
> Ping
>
>
> --- Luis Ibanez <luis.ibanez@kitware.com> wrote:
>
>>Hi Ping,
>>
>>Your code looks fine.
>>
>>
>>Note that you are applying a deformable registration
>>methods to a pair of images that are only different
>>in their translation.
>>
>>The ranges that you obtain from ParaView seems to
>>be ok with the expected translations: 13 in X and 17
>>in Y.
>>
>>Please try the following:
>>
>>After updating the reader of the deformation field,
>>
>>add a while loop and visit all the pixels in the
>>vector field, and compute the max abs value of
>>the components.
>>
>>The fact is that if you still are observing that
>>the warped image looks exactly the same as the
>>input image... that means that the vector field
>>is null... and there may be still some problem
>>when reading vector images.
>>
>>Your experiment with the while loop will help
>>to decide the question.
>>
>>The loop will look like
>>
>>double maxx = 0;
>>double maxy = 0;
>>itk::ImageRegionIterator<
>> DeformationFieldType > it( fieldimage,
>> fieldimage->GetBufferedRegion() );
>>
>>it.GoToBegin();
>>
>>while( !it.IsAtEnd() )
>> {
>> const double x = fabs( (*it)[0] );
>> const double y = fabs( (*it)[1] );
>> if( x > maxx ) maxx = x ;
>> if( y > maxy ) maxy = y ;
>> ++it;
>> }
>>
>>std::cout << "Max fabs X = " << maxx << std::endl;
>>std::cout << "Max fabs Y = " << maxy << std::endl;
>>
>>
>>
>>
>>Please let us know what you find.
>>
>>
>> Thanks
>>
>>
>>
>> Luis
>>
>>
>>
>>
>>-----------------
>>ping chen wrote:
>>
>>
>>>Hi Luis,
>>>
>>>I dont understand when you say
>>>
>>> Note that the values of the deformation
>>>
>>>
>>>>field vectors are in physical units,
>>>>not pixels, therefore you have to
>>>>interpret them in the context of the
>>>>pixel spacing in your image.
>>>
>>>
>>>
>>>in DeformableRegistration1, the program will
>>
>>produce a
>>
>>>deformationation field which is
>>>VectorDeformationField.mhd
>>>VectorDeformationField.raw
>>>which warps BrainProtonDensitySliceBorder20.png as
>>>moving image to
>>>BrainProtonDensitySliceShifted13x17y.png as fixed
>>>image.
>>>so for this 2d deformableregistration, i didnt
>>
>>make
>>
>>>any change, i suppose the deformationfield should
>>
>>be
>>
>>>all right. i have viewed the deformationfield in
>>
>>the
>>
>>>paraview, it is nonzeros.
>>>
>>>bounds:
>>>x range 0 to 12.9
>>>y range 0 to 15.9
>>>z range 0 to 0.
>>>
>>>
>>>then in my code, i just create the
>>
>>VectorImageReader,
>>
>>>and read in this VectorDeformationField.mhd file,
>>
>>and
>>
>>>then update, and then GetOutput to set the
>>
>>deformation
>>
>>>field in the warper. thank you very much for your
>>>suggestions.
>>>
>>>-Ping
>>>
>>>
>>>
>>>below is my code
>>>
>>>// Software Guide : BeginLatex
>>>//
>>>// The following code is an implementation of a
>>
>>small
>>
>>>Insight
>>>// program. It tests including header files and
>>>linking with ITK
>>>// libraries.
>>>//
>>>// Software Guide : EndLatex
>>>
>>>// Software Guide : BeginCodeSnippet
>>>#include "itkImage.h"
>>>#include "itkImageFileReader.h"
>>>#include "itkImageFileWriter.h"
>>>#include "itkWarpImageFilter.h"
>>>#include "itkLinearInterpolateImageFunction.h"
>>>#include <iostream>
>>>
>>>typedef itk::Image<unsigned char, 2>
>>
>>InputImageType;
>>
>>>typedef itk::Image<float, 2> OutputImageType;
>>>
>>>typedef itk::ImageFileReader< InputImageType >
>>>InputReaderType;
>>>
>>>typedef itk::Vector< float, 2 >
>>
>>VectorPixelType;
>>
>>>typedef itk::Image< VectorPixelType, 2 >
>>>DeformationFieldType;
>>>
>>>typedef itk::ImageFileReader< DeformationFieldType
>>>
>>>FieldReaderType;
>>>
>>>typedef itk::WarpImageFilter<
>>> InputImageType,
>>> OutputImageType,
>>> DeformationFieldType >
>>
>>
>>
>>>WarperType;
>>>typedef itk::LinearInterpolateImageFunction<
>>> InputImageType,
>>> double
>>>
>>>InterpolatorType;
>>>
>>>
>>>int main(int argc, char *argv[])
>>>{
>>> char *fieldimage;
>>> char *towarpimage;
>>> char *warpedimage;
>>>
>>> if ( argc < 4 )
>>> {
>>> std::cout << "Parameter file name missing" <<
>>>std::endl;
>>> std::cerr << " fieldimage towarpimagename
>>>warpedimagename";
>>> std::cout << "Usage: " << argv[0] << "
>>
>>param.file"
>>
>>><< std::endl;
>>>
>>> return -1;
>>> }
>>> else
>>> {
>>> fieldimage=argv[1];
>>> towarpimage = argv[2];
>>> warpedimage = argv[3];
>>> }
>>>
>>>FieldReaderType::Pointer fieldreader1 =
>>>FieldReaderType::New();
>>>InputReaderType::Pointer towarpreader =
>>>InputReaderType::New();
>>>
>>>fieldreader1->SetFileName(fieldimage);
>>
> === message truncated ===
>
>
>
>
> __________________________________
> Do you Yahoo!?
> Yahoo! Domains Claim yours for only $14.70/year
> http://smallbusiness.promotions.yahoo.com/offer
>
More information about the Insight-users
mailing list