<div dir="ltr"><div><span style="font-family:arial,sans-serif;font-size:13px">Hi Zarko,</span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">Good question.  My own approach would be to build the matrix with</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">the binormal, normal, and tangent as the matrix columns from the</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">very beginning.  That way, no transpose is required:</span></div><span style="font-family:arial,sans-serif;font-size:13px"><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div>        resliceAxes->SetElement(comp, 0</span><span style="font-family:arial,sans-serif;font-size:13px">, binormal[comp]);</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">        resliceAxes->SetElement(comp, 1</span><span style="font-family:arial,sans-serif;font-size:13px">, normal[comp]);</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">        resliceAxes->SetElement(comp, 2</span><span style="font-family:arial,sans-serif;font-size:13px">, tangent[comp]);</span><br><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">And you're correct that the code was simply transforming the origin</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">back and forth.  It makes more sense to just use the origin as-is:</span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">        resliceAxes->SetElement(0, 3, </span><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">origin[0]);</span><br style="font-family:arial,sans-serif;font-size:13.3333339691162px"><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">        resliceAxes->SetElement(1, 3, </span><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">origin[1]);</span><br style="font-family:arial,sans-serif;font-size:13.3333339691162px"><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">        resliceAxes->SetElement(2, 3, </span><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">origin[2]);</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">        this->reslicer-></span><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">SetResliceAxes(resliceAxes);</span><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">Now the best way to think of the rotation is as follows.  The output</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">of vtkImageReslice is (in this case) an XY plane with a given extent</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">and sample spacing.  The job of the ResliceAxes is to rotate that</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">plane so that it "cuts" (or "slices") the input data at the correct angles.</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">The way that the vtkImageReslice algorithm works is this: it loops</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">through the output points, and for each of these points it</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">1) computes (x,y,z) according to the OutputSpacing and OutputOrigin</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">2) applies the ResliceAxes matrix to (x,y,z,1) to get (x',y',z',1)</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">3) samples (i.e. interpolates) the input image at (x',y',z') to get the</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">value to use for </span><span style="font-family:arial,sans-serif;font-size:13.3333339691162px">the output voxel at (x,y,z)</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px"> - David</span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13.3333339691162px"><br></span></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Dec 3, 2014 at 3:45 PM, zarko.milosevic <span dir="ltr"><<a href="mailto:zarko@kg.ac.rs" target="_blank">zarko@kg.ac.rs</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear David,<br>
<br>
I have encountered on some class vtkSplineDrivenImageSlicer which implements<br>
everything that i need for the my task. Actually that class is facade<br>
(wrapper) class which uses vtkImageReslice for reslicing and<br>
vtkFrenetSerretFrame for generating resliceAxes of vtkImageReslice.<br>
<a href="http://www.vtkjournal.org/browse/publication/838" target="_blank">http://www.vtkjournal.org/browse/publication/838</a><br>
<br>
To sum up. This class as input requires image data and path in form of poly<br>
line. Using the path class generates three orthogonal vector representing<br>
the local coordinate frame in every point of the polyline. For those<br>
purposes this class uses Frenet Serret formula implemented in class<br>
vtkFrenetSerretFrame. Using those vectors resliceAxes are generated and new<br>
slices are extracted.<br>
<br>
I have problem with one piece of code from that class to understand. This is<br>
where i`m stuck:<br>
<br>
for ( int comp = 0; comp < 3; comp++ )<br>
{<br>
// Here reslice matrix is built using thre ortogonal vectors generated in<br>
previous step from path<br>
        resliceAxes->SetElement(0,comp,binormal[comp]);<br>
        resliceAxes->SetElement(1,comp,normal[comp]);<br>
        resliceAxes->SetElement(2,comp,tangent[comp]);<br>
<br>
// Here is calculated orgin of the slice so it would not be in the origin of<br>
the frame (resliceaxes) but in in  // lower left corner of the slice because<br>
sliceExtent is from 0, sliceExtent[0] and etc.<br>
        origin[comp] = center[comp] -<br>
normal[comp]*this->SliceExtent[1]*this->SliceSpacing[1]/2.0<br>
                                - binormal[comp]*this->SliceExtent[0]*this->SliceSpacing[0]/2.0;<br>
}<br>
<br>
//! Transform the origin in the homogeneous coordinate space. Is that<br>
necessary in this way ?<br>
                 origin[3] = 1.0;<br>
                 double originXYZW[4];<br>
                 resliceAxes->MultiplyPoint(origin, originXYZW);<br>
<br>
//! Get the new origin from the transposed matrix.<br>
         resliceAxes->Transpose();<br>
         double neworiginXYZW[4];<br>
         resliceAxes->MultiplyPoint(originXYZW, neworiginXYZW);<br>
<br>
         resliceAxes->SetElement(0,3,neworiginXYZW[0]);<br>
         resliceAxes->SetElement(1,3,neworiginXYZW[1]);<br>
         resliceAxes->SetElement(2,3,neworiginXYZW[2]);<br>
 this->reslicer->SetResliceAxes( resliceAxes );<br>
<br>
Creating the newOriginXYZW in this way does not have any sense.<br>
newOriginXYZW is the same as Origin.<br>
Transposing the resliceaxes where only rotation matrix elements are present<br>
have same result as inverting the rotation matrix.<br>
originXYZW = resliceAxes(onlyRotation) * origin<br>
neworiginXYZW = resliceAxes(onlyRotation)^-1 * originXYZW => origin<br>
But that is not main problem.<br>
<br>
Main question is do you have idea why transposed (inverted rotation) is<br>
passed to reslicer ?<br>
Results with including Transposed matrix is little bit better than without<br>
it. Images are little bit better aligned but nothing significant.<br>
<br>
Best regards<br>
Zarko<br><div><div><br>
</div></div></blockquote></div><br></div></div>