<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>

<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7226.0">
<TITLE>Re: [Insight-users] Applying a transform? PointSet registration?</TITLE>
</HEAD>
<BODY>
<DIV id=idOWAReplyText28693 dir=ltr>
<DIV dir=ltr><FONT face=Arial color=#000000 size=2>Hi Luis,</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2>Thanks for your help and insight :0 but 
back to basics, I have actually tried to apply the transform and I am having 
some very basic trouble.</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2>I included the header for 
itkTransformMeshFilter.h and templated such a filter, modifying 
Examples/Patented/IterativeClosestPoint2.cxx for this purpose as this one is 
used in the users guide. </FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2>Once an instance of the transform filter is 
created , the program will not compile. </FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2>Below &nbsp;is the diff from the original 
example (only 3 lines different ) I have tried changing PointSet 
&lt;float,Dimension&gt; to PointSet&lt;double,Dimension&gt;&nbsp; (line 54 in 
the original) with similar results;</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2>Thanks again,<BR>Robert</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2><FONT 
face="Courier New"><BR>&nbsp;</DIV></FONT></FONT>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2>Diff from the example:</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2><FONT face="Courier New">[rcatwood@xe01 
itk_examples]$ diff ../itk_examples_src/IterativeClosestPoint2.cxx 
/sources/local/ITK_cvs/Examples/Patented/IterativeClosestPoint2.cxx<BR>36d35<BR>&lt; 
#include "itkTransformMeshFilter.h"<BR>142,143d140<BR>&lt;&nbsp;&nbsp; typedef 
itk::TransformMeshFilter&lt;PointSetType,PointSetType,TransformType&gt; 
MoverType;<BR>&lt;&nbsp;&nbsp; MoverType::Pointer mover = 
MoverType::New();<BR>[rcatwood@xe01 itk_examples]$<BR></FONT></DIV></FONT><FONT 
face=Arial size=2></FONT></DIV>
<DIV dir=ltr>&nbsp;</DIV>
<DIV dir=ltr>&nbsp;</DIV>
<DIV dir=ltr>
<DIV dir=ltr><FONT face=Arial size=2>This generates the errors 
below:</FONT></DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT face=Arial size=2><FONT face="Courier New">[rcatwood@xe01 
itk_examples]$ make<BR>Building object file 
IterativeClosestPoint2.o...<BR>/usr/local/encap/ITK_2.0.1.0/include/InsightToolkit/BasicFilters/itkTransformMeshFilter.txx: 
In<BR>&nbsp;&nbsp; member function `void itk::TransformMeshFilter&lt;TInputMesh, 
TOutputMesh,<BR>&nbsp;&nbsp; TTransform&gt;::GenerateData() [with TInputMesh = 
main(int,<BR>&nbsp;&nbsp; char**)::PointSetType, TOutputMesh = main(int, 
char**)::PointSetType,<BR>&nbsp;&nbsp; TTransform = main(int, 
char**)::TransformType]':<BR>/usr/include/c++/3.2.3/bits/locale_facets.h:115:&nbsp;&nbsp; 
instantiated from 
here<BR>/usr/local/encap/ITK_2.0.1.0/include/InsightToolkit/BasicFilters/itkTransformMeshFilter.txx:95: 
no<BR>&nbsp;&nbsp; matching function for call to 
`itk::Euler3DTransform&lt;double&gt;::TransformPoint<BR>&nbsp;&nbsp; (const 
itk::Point&lt;float, 
3&gt;&amp;)'<BR>/usr/local/encap/ITK_2.0.1.0/include/InsightToolkit/Common/itkMatrixOffsetTransformBase.txx:197: 
candidates<BR>&nbsp;&nbsp; are: itk::Point&lt;TScalarType, 
itk::MatrixOffsetTransformBase&lt;TScalarType,<BR>&nbsp;&nbsp; NInputDimensions, 
NOutputDimensions&gt;::OutputSpaceDimension&gt;<BR>&nbsp;&nbsp; 
itk::MatrixOffsetTransformBase&lt;TScalarType, NInputDimensions,<BR>&nbsp;&nbsp; 
NOutputDimensions&gt;::TransformPoint(const 
itk::Point&lt;TScalarType,<BR>&nbsp;&nbsp; 
itk::MatrixOffsetTransformBase&lt;TScalarType, NInputDimensions,<BR>&nbsp;&nbsp; 
NOutputDimensions&gt;::InputSpaceDimension&gt;&amp;) const [with TScalarType = 
double,<BR>&nbsp;&nbsp; unsigned int NInputDimensions = 3, unsigned int 
NOutputDimensions = 
3]<BR>/usr/include/c++/3.2.3/bits/locale_facets.h:115:&nbsp;&nbsp; instantiated 
from 
here<BR>/usr/local/encap/ITK_2.0.1.0/include/InsightToolkit/BasicFilters/itkTransformMeshFilter.txx:107: 
no<BR>&nbsp;&nbsp; matching function for call to `itk::PointSet&lt;float, 
3,<BR>&nbsp;&nbsp; itk::DefaultStaticMeshTraits&lt;float, 3, 3, float, float, 
float&gt; &gt;::<BR>&nbsp;&nbsp; 
GetCellLinks()'<BR>/usr/local/encap/ITK_2.0.1.0/include/InsightToolkit/BasicFilters/itkTransformMeshFilter.txx:109: 
no<BR>&nbsp;&nbsp; matching function for call to `itk::PointSet&lt;float, 
3,<BR>&nbsp;&nbsp; itk::DefaultStaticMeshTraits&lt;float, 3, 3, float, float, 
float&gt; &gt;::GetCells()<BR>&nbsp;&nbsp; 
'<BR>/usr/local/encap/ITK_2.0.1.0/include/InsightToolkit/BasicFilters/itkTransformMeshFilter.txx:110: 
no<BR>&nbsp;&nbsp; matching function for call to `itk::PointSet&lt;float, 
3,<BR>&nbsp;&nbsp; itk::DefaultStaticMeshTraits&lt;float, 3, 3, float, float, 
float&gt; &gt;::<BR>&nbsp;&nbsp; 
GetCellData()'<BR>/usr/local/encap/ITK_2.0.1.0/include/InsightToolkit/BasicFilters/itkTransformMeshFilter.txx:113: 
`<BR>&nbsp;&nbsp; MaxTopologicalDimension' is not a member of type 
`main(int,<BR>&nbsp;&nbsp; 
char**)::PointSetType'<BR>/usr/local/encap/ITK_2.0.1.0/include/InsightToolkit/BasicFilters/itkTransformMeshFilter.txx:117: 
no<BR>&nbsp;&nbsp; matching function for call to `itk::PointSet&lt;float, 
3,<BR>&nbsp;&nbsp; itk::DefaultStaticMeshTraits&lt;float, 3, 3, float, float, 
float&gt; &gt;::<BR>&nbsp;&nbsp; GetBoundaryAssignments(unsigned 
int&amp;)'<BR>make[1]: *** [IterativeClosestPoint2.o] Error 1<BR>make: *** 
[default_target] Error 2<BR>[rcatwood@xe01 
itk_examples]$<BR></FONT></DIV></FONT></DIV>
<DIV dir=ltr>
<HR tabIndex=-1>
</DIV>
<DIV dir=ltr><FONT face=Tahoma size=2><B>From:</B> Luis Ibanez 
[mailto:luis.ibanez@kitware.com]<BR><B>Sent:</B> Thu 19/05/2005 
03:51<BR><B>To:</B> Atwood, Robert C<BR><B>Cc:</B> ITK Users<BR><B>Subject:</B> 
Re: [Insight-users] Applying a transform? PointSet 
registration?<BR></FONT><BR></DIV>
<DIV><BR><BR>
<P><FONT size=2>Hi Robert,<BR><BR><BR><BR>1) You are right, the current name of 
the TransformMeshFilter is<BR>&nbsp;&nbsp;&nbsp; misleading. It should&nbsp; 
probably be called TransformPointSetFilter.<BR><BR><BR>2) You can transform a 
single point. Just call the TransformPoint()<BR>&nbsp;&nbsp;&nbsp; method of any 
Transform.&nbsp; There is no need for creating a Point<BR>&nbsp;&nbsp;&nbsp; Set 
of a single point.<BR><BR><BR>3) The reason why you are being asked for a 
MultipleValued optimizer<BR>&nbsp;&nbsp;&nbsp; is that you took code from a 
point set optimization where the<BR>&nbsp;&nbsp;&nbsp; cost function is 
multivalue. E.g. the cost function "value" is<BR>&nbsp;&nbsp;&nbsp; an array of 
N values. (N= number of points in the point set).<BR><BR>&nbsp;&nbsp;&nbsp; You 
can simply change the PointSet metric for another one that<BR>&nbsp;&nbsp;&nbsp; 
computes things like the sum of square distances between the 
points.<BR><BR><BR>4) Yeap,... in principle, the registration framework lets 
you<BR>&nbsp;&nbsp;&nbsp; mix any type of opmizer. However in practice, not all 
combinations<BR>&nbsp;&nbsp;&nbsp; make sense.&nbsp; For example, As you just 
found. It doesn't makes sense<BR>&nbsp;&nbsp;&nbsp; to use a SingleValued 
optimizer for optimizing a MultipleValues<BR>&nbsp;&nbsp;&nbsp; cost 
function.<BR><BR>&nbsp;&nbsp;&nbsp; Some optimizers are quite tailored to 
particular cases. For example,<BR>&nbsp;&nbsp;&nbsp; the VersorRigid3DOptimizer 
is intended to be used *ONLY* with the<BR>&nbsp;&nbsp;&nbsp; 
VersorRigid3DTransform.<BR><BR><BR><BR><BR><BR>&nbsp; 
Regards,<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Luis<BR><BR><BR><BR>------------------------<BR>Atwood, Robert C 
wrote:<BR><BR>&gt; Thanks Luis! I thought was something like that ,but for some 
reason it<BR>&gt; was not clear to me that a PointSet is able to be used where a 
'mesh<BR>&gt; type' is asked for. I had looked at this doxygen page but assumed 
it had<BR>&gt; to be a mesh (with polygons, edges etc) I guess you meant<BR>&gt; 
TransformMeshFilter when you typed TransformMeshImageFilter.<BR>&gt;<BR>&gt; Can 
a transform be applied to a single point, or would you create a<BR>&gt; pointset 
with one point in it ? More generally , how do I know what<BR>&gt; types of 
class can go in TInputMesh?<BR>&gt;<BR>&gt; itk::TransformMeshFilter&lt; 
TInputMesh, TOutputMesh, TTransform &gt; Class<BR>&gt; Template 
Reference<BR>&gt;<BR>&gt; Next question: Since I successfully used 
VersorRigid3dTransform for<BR>&gt; registering 3D image files I thought I could 
use this transform for<BR>&gt; registring point sets that may be offset and 
rotated. However, if I try<BR>&gt; to plug the special Versor optimizer into the 
registration method, it<BR>&gt; comlains that it requires a 
MultipleValuedNonLinearOptimizer. I don't<BR>&gt; know exactly what that means 
in this context, but follwing the example<BR>&gt; in the Software Guide I used 
Euler3dTransform instead. So far so good...<BR>&gt;<BR>&gt; But, when looking in 
the Doxygen pages for<BR>&gt; PointSetToPOintSetRegistrationMethod it 
says:<BR>&gt;<BR>&gt; "The registration method also support a generic optimizer 
that can be<BR>&gt; selected at run-time. The only restriction for the optimizer 
is that it<BR>&gt; should be able to operate in single-valued cost functions 
given that the<BR>&gt; metrics used to compare PointSet with PointSets provide a 
single value<BR>&gt; as output."<BR>&gt;<BR>&gt; Then, when I look at the 
optimizer used in the example<BR>&gt; LevenbergMarquardtOptimizer , and go to 
its parent class,<BR>&gt; MultipleValuedNonLinearVnlOptimizer, it 
says:<BR>&gt;<BR>&gt; "This class is a base for the Optimization methods that 
optimize a<BR>&gt; single valued function."<BR>&gt;<BR>&gt; Its parent class 
says:<BR>&gt;<BR>&gt; MultipleValuedNonLinearOptimizer<BR>&gt; "This class is a 
base for the Optimization methods that optimize a<BR>&gt; multiple valued 
function."<BR>&gt;<BR>&gt; So I am confused about when it is, or just what is, 
"single" or<BR>&gt; "multiple" valued and then how to decide which optimizer 
will work with<BR>&gt; which registration method?<BR>&gt;<BR>&gt; I am thinking 
about future uses as I think the Levenberg-Marquardt with<BR>&gt; Euler3d will 
work for this purpose. For example we might wish to<BR>&gt; register images 
and/or point-scans of the prosthsis to various medical<BR>&gt; images of the 
patient&nbsp; , then I would need to use other registration<BR>&gt; methods and 
figure out which optimizer works with it!<BR>&gt;<BR>&gt;<BR>&gt; Thanks 
again.<BR>&gt; Robert<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; -----Original 
Message-----<BR>&gt; From: Luis Ibanez [<A 
href="mailto:luis.ibanez@kitware.com">mailto:luis.ibanez@kitware.com</A>]<BR>&gt; 
Sent: Fri 5/13/2005 1:48 PM<BR>&gt; To: Atwood, Robert C<BR>&gt; Cc: ITK 
Users<BR>&gt; Subject: Re: [Insight-users] Applying a transform? PointSet 
registration?<BR>&gt;<BR>&gt;<BR>&gt; Hi Robert,<BR>&gt;<BR>&gt;<BR>&gt; The 
class that you are looking for is the:<BR>&gt;<BR>&gt; 
TransformMeshImageFilter:<BR>&gt; <A 
href="http://www.itk.org/Insight/Doxygen/html/classitk_1_1TransformMeshFilter.html">http://www.itk.org/Insight/Doxygen/html/classitk_1_1TransformMeshFilter.html</A><BR>&gt;<BR>&gt; 
Simply instantiate this filter using your PointSet&lt;&gt; as template<BR>&gt; 
parameter. Then connect as inputs your Transform and your input<BR>&gt; 
PointSet.<BR>&gt;<BR>&gt; The filter will apply the Transform to all the Points 
in your PointSet.<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp; 
Regards,<BR>&gt;<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Luis<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; 
--------------------------------------------------------------------------------<BR>&gt; 
Atwood, Robert C wrote:<BR>&gt;&nbsp; &gt; I have been poring through the 
software guide and the Doxygen for hours,<BR>&gt;&nbsp; &gt; and I cannot see 
how to apply a transform to a point or a PointSet? I<BR>&gt;&nbsp; &gt; know how 
to apply to an image, you create a resample image filter and<BR>&gt;&nbsp; &gt; 
set the transform , is there a similar filter for PointSets (and what 
is<BR>&gt;&nbsp; &gt; it called) or is the process different?<BR>&gt;&nbsp; 
&gt;<BR>&gt;&nbsp; &gt;<BR>&gt;&nbsp; &gt; The immediate goal is to register two 
point sets, then somehow quantify<BR>&gt;&nbsp; &gt; the difference between 
them. I believe that this would be enabled by<BR>&gt;&nbsp; &gt; transforming 
one of the point set into the space of the other according<BR>&gt;&nbsp; &gt; to 
the result of the registration.<BR>&gt;&nbsp; &gt;<BR>&gt;&nbsp; &gt; The 
overall goal is to quantify (and eventually minimize) the misfit 
of<BR>&gt;&nbsp; &gt; certain prostheses introduced at certain stages during the 
manufacturing<BR>&gt;&nbsp; &gt; process, by scanning 'before' and 'after' 
examples. The scan method<BR>&gt;&nbsp; &gt; produces a point set. The point set 
is not necessarily any sort of<BR>&gt;&nbsp; &gt; regular grid. (The points are 
in&nbsp; 3-d by the way) The 2 sets should<BR>&gt;&nbsp; &gt; generally be 
reasonably close to each other to start with (by placing<BR>&gt;&nbsp; &gt; the 
example in the same location and orientation)<BR>&gt;&nbsp; &gt;<BR>&gt;&nbsp; 
&gt;<BR>&gt;&nbsp; &gt;<BR>&gt;&nbsp; &gt; Thanks,<BR>&gt;&nbsp; &gt; 
Robert<BR>&gt;&nbsp; &gt;<BR>&gt;&nbsp; &gt;<BR>&gt;&nbsp; &gt;<BR>&gt;&nbsp; 
&gt;<BR>&gt;&nbsp; &gt;<BR>&gt;&nbsp; &gt; 
------------------------------------------------------------------------<BR>&gt;&nbsp; 
&gt;<BR>&gt;&nbsp; &gt; 
_______________________________________________<BR>&gt;&nbsp; &gt; Insight-users 
mailing list<BR>&gt;&nbsp; &gt; Insight-users@itk.org<BR>&gt;&nbsp; &gt; <A 
href="http://www.itk.org/mailman/listinfo/insight-users">http://www.itk.org/mailman/listinfo/insight-users</A><BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; 
------------------------------------------------------------------------<BR>&gt;<BR>&gt; 
_______________________________________________<BR>&gt; Insight-users mailing 
list<BR>&gt; Insight-users@itk.org<BR>&gt; <A 
href="http://www.itk.org/mailman/listinfo/insight-users">http://www.itk.org/mailman/listinfo/insight-users</A><BR><BR><BR><BR></FONT></P></DIV>

</BODY>
</HTML>