<div>Hello Andriy,</div>thanks for you tips. I reinitialize the seed every time, so the two different methods are consistent between runs but not between each other.<div><br></div><div>I&#39;m checking if the two different methods of reading the images result in the same pixel values right now, so I will report back on that when I have the results. The difference between the methods are huge for some images, and reading the images from files constantly generate correct results whereas the resuts when the images are passed from matlab are sometimes really bad (rotated 90 degrees or something like that). </div>
<div><br></div><div>I was thinking of comparing the images using an iterator and comparing pixel by pixel. Is there another way of comparing the images that is easier? </div><div><br></div><div>Thanx for your input.</div>
<div><br></div><div>//Patrik<br><div><br><div class="gmail_quote">2009/9/16 Andriy Fedorov <span dir="ltr">&lt;<a href="mailto:fedorov@bwh.harvard.edu">fedorov@bwh.harvard.edu</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Patrick,<br>
<br>
Registration has the metric sampling component, which is initialized<br>
with a random seed by default. If you want to have consistent results<br>
you might need to initialize registration with the same seed.<br>
<br>
Another guess is to check that there is no type cast involved when you<br>
read the image in Matlab. This might result in loss of precision.<br>
<br>
Not sure if any of these is the source of the problem for you, just<br>
some ideas to investigate.<br>
<br>
Andriy Fedorov<br>
<br>
<br>
<br>
&gt; Date: Wed, 16 Sep 2009 09:02:59 +0200<br>
&gt; From: Patrik Brynolfsson &lt;<a href="mailto:patrik.brynolfsson@gmail.com">patrik.brynolfsson@gmail.com</a>&gt;<br>
&gt; Subject: Re: [Insight-users] Vital DICOM information/tags when<br>
&gt;        registering     images?<br>
&gt; To: Bill Lorensen &lt;<a href="mailto:bill.lorensen@gmail.com">bill.lorensen@gmail.com</a>&gt;, ITK<br>
&gt;        &lt;<a href="mailto:insight-users@itk.org">insight-users@itk.org</a>&gt;<br>
&gt; Message-ID:<br>
&gt;        &lt;<a href="mailto:8d0068770909160002r1e0aa86el32f78b0d027c9368@mail.gmail.com">8d0068770909160002r1e0aa86el32f78b0d027c9368@mail.gmail.com</a>&gt;<br>
&gt; Content-Type: text/plain; charset=&quot;iso-8859-1&quot;<br>
<div><div></div><div class="h5">&gt;<br>
&gt; Hello Bill, thanx for answering!<br>
&gt;<br>
&gt; The filter I use are:<br>
&gt; Registration part (same for both cases):<br>
&gt;<br>
&gt; itkImageRegistrationMethod<br>
&gt; itkMattesMutualInformationImageToImageMetric<br>
&gt; itkLinearInterpolateImageFunction<br>
&gt; itkVersorRigid3DTransform<br>
&gt; itkVersorRigid3DTransformOptimizer<br>
&gt; itkCenteredTransformInitializer<br>
&gt;<br>
&gt; Reading images from memory:<br>
&gt;<br>
&gt; itkImportImageFilter<br>
&gt; itkChangeInformationImageFilter<br>
&gt;<br>
&gt; Reading images from DICOM:<br>
&gt;<br>
&gt; itkImageSeriesReader<br>
&gt; itkGDCMImageIO<br>
&gt; itkGDCMSeriesFileNames<br>
&gt;<br>
&gt; *The code to read images from memory is:*<br>
&gt;<br>
&gt;  typedef itk::ImportImageFilter&lt;PixelType,Dimension&gt; ImportFilterType;<br>
&gt;  ImportFilterType::Pointer fixedImageReader = ImportFilterType::New();<br>
&gt;  ImportFilterType::Pointer movingImageReader = ImportFilterType::New();<br>
&gt;<br>
&gt;  const mwSize*   dimsFix = mxGetDimensions(prhs[0]);<br>
&gt;  const mwSize*   dimsMov = mxGetDimensions(prhs[1]);<br>
&gt;<br>
&gt;  ImportFilterType::SizeType sizeFix;<br>
&gt;  ImportFilterType::SizeType sizeMov;<br>
&gt;  sizeFix[0] = dimsFix[0];<br>
&gt;  sizeFix[1] = dimsFix[1];<br>
&gt;  sizeFix[2] = dimsFix[2];<br>
&gt;<br>
&gt;  sizeMov[0] = dimsMov[0];<br>
&gt;  sizeMov[1] = dimsMov[1];<br>
&gt;  sizeMov[2] = dimsMov[2];<br>
&gt;<br>
&gt;  ImportFilterType::IndexType start;<br>
&gt;  start.Fill( 0 );<br>
&gt;  ImportFilterType::RegionType regionFix;<br>
&gt;  regionFix.SetIndex( start );<br>
&gt;  regionFix.SetSize(  sizeFix  );<br>
&gt;  ImportFilterType::RegionType regionMov;<br>
&gt;  regionMov.SetIndex( start );<br>
&gt;  regionMov.SetSize(  sizeMov  );<br>
&gt;  fixedImageReader-&gt;SetRegion( regionFix );<br>
&gt;  movingImageReader-&gt;SetRegion(regionMov );<br>
&gt;<br>
&gt;  //Import image from memory, passed from MATLAB<br>
&gt;  fixedImageReader-&gt;SetImportPointer((PixelType*)mxGetData(prhs[0]),mxGetNumberOfElements(prhs[0]),false);<br>
&gt;  movingImageReader-&gt;SetImportPointer((PixelType*)mxGetData(prhs[1]),mxGetNumberOfElements(prhs[1]),false);<br>
&gt;  fixedImageReader-&gt;Update();<br>
&gt;  movingImageReader-&gt;Update();<br>
&gt;<br>
&gt; *...and the code to set the relevant info is:*<br>
&gt;<br>
&gt;  double *fixedSpacingInput    = mxGetPr(prhs[2]);<br>
&gt;  double *movingSpacingInput = mxGetPr(prhs[3]);<br>
&gt;<br>
&gt;  double *fixedOrientationInput = mxGetPr(prhs[4]);<br>
&gt;  double *movingOrientationInput = mxGetPr(prhs[5]);<br>
&gt;<br>
&gt;  double *fixedOriginInput = mxGetPr(prhs[6]);<br>
&gt;  double *movingOriginInput = mxGetPr(prhs[7]);<br>
&gt;<br>
&gt;  **Code for casting input to correct types are skipped, not important for<br>
&gt; this question**<br>
&gt;<br>
&gt;  typedef itk::ChangeInformationImageFilter&lt; FixedImageType &gt;<br>
&gt; ChangeInfoType;<br>
&gt;  ChangeInfoType::Pointer changeFixedInfo = ChangeInfoType::New();<br>
&gt;  ChangeInfoType::Pointer changeMovingInfo = ChangeInfoType::New();<br>
&gt;<br>
&gt;  changeFixedInfo-&gt;SetInput(fixedImageReader-&gt;GetOutput());<br>
&gt;  changeMovingInfo-&gt;SetInput(movingImageReader-&gt;GetOutput());<br>
&gt;<br>
&gt;  changeFixedInfo-&gt;SetOutputSpacing(fixedSpacing);<br>
&gt;  changeMovingInfo-&gt;SetOutputSpacing(movingSpacing);<br>
&gt;  changeFixedInfo-&gt;SetChangeSpacing(true);<br>
&gt;  changeMovingInfo-&gt;SetChangeSpacing(true);<br>
&gt;<br>
&gt;  changeFixedInfo-&gt;SetOutputDirection(fixedOrientation);<br>
&gt;  changeMovingInfo-&gt;SetOutputDirection(movingOrientation);<br>
&gt;  changeFixedInfo-&gt;SetChangeDirection(true);<br>
&gt;  changeMovingInfo-&gt;SetChangeDirection(true);<br>
&gt;<br>
&gt;  changeFixedInfo-&gt;SetOutputOrigin(fixedOrigin);<br>
&gt;  changeMovingInfo-&gt;SetOutputOrigin(movingOrigin);<br>
&gt;  changeFixedInfo-&gt;SetChangeOrigin(true);<br>
&gt;  changeMovingInfo-&gt;SetChangeOrigin(true);<br>
&gt;<br>
&gt;  changeFixedInfo-&gt;Update();<br>
&gt;  changeMovingInfo-&gt;Update();<br>
&gt;<br>
&gt;  registration-&gt;SetFixedImage(    changeFixedInfo-&gt;GetOutput()    );<br>
&gt;  registration-&gt;SetMovingImage(   changeMovingInfo-&gt;GetOutput()   );<br>
&gt;  registration-&gt;SetFixedImageRegion(<br>
&gt; changeFixedInfo-&gt;GetOutput()-&gt;GetBufferedRegion()<br>
&gt; );<br>
&gt;<br>
&gt; As a check I print the origin, spacing and direction for the images and they<br>
&gt; are identical to when reading from DICOM files. I read the DICOM series just<br>
&gt; as described in chapter 7.12 in the ITK manual.<br>
&gt;<br>
&gt; Any ideas to what might be wrong here?<br>
&gt;<br>
&gt; Thanks in advance!<br>
&gt;<br>
&gt; //Patrik Brynolfsson<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; 2009/9/16 Bill Lorensen &lt;<a href="mailto:bill.lorensen@gmail.com">bill.lorensen@gmail.com</a>&gt;<br>
&gt;<br>
&gt;&gt; You should get the same answers. Exactly what filters are you using in<br>
&gt;&gt; each of the cases. I can&#39;t tell from your description.<br>
&gt;&gt;<br>
&gt;&gt; Bill<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Sep 15, 2009 at 4:38 PM, Patrik Brynolfsson<br>
&gt;&gt; &lt;<a href="mailto:patrik.brynolfsson@gmail.com">patrik.brynolfsson@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt; Hello,<br>
&gt;&gt; &gt; I&#39;m working on a Matlab mex-implementation of an ITK registration. This<br>
&gt;&gt; &gt; means that instead of loading the images from files I will load them from<br>
&gt;&gt; &gt; memory as 3D matrices. All the DICOM information needs to be passed to<br>
&gt;&gt; ITK<br>
&gt;&gt; &gt; from Matlab as well, and this is where my problems begin. The information<br>
&gt;&gt; &gt; that I thought was essential for a correct registration is:<br>
&gt;&gt; &gt; * Origin<br>
&gt;&gt; &gt; * Spacing<br>
&gt;&gt; &gt; * Direction<br>
&gt;&gt; &gt; I set these using the &quot;ChangeInformationImageFilter&quot; and it is working;<br>
&gt;&gt; the<br>
&gt;&gt; &gt; images have the origin, spacing and directional cosines that are assigned<br>
&gt;&gt; to<br>
&gt;&gt; &gt; them, and they are the same as if the dicom images were loaded from<br>
&gt;&gt; files.<br>
&gt;&gt; &gt; However, the result of the registration is different from that when<br>
&gt;&gt; loading<br>
&gt;&gt; &gt; the images from files, with all other components set the same, (of course<br>
&gt;&gt; I<br>
&gt;&gt; &gt; reinitialize the seed). Not by much, but they should be exactly the same!<br>
&gt;&gt; I<br>
&gt;&gt; &gt; use Mattes mutual information metric, linear interpolation, Versor rigid<br>
&gt;&gt; 3D<br>
&gt;&gt; &gt; transform and the accompanying Versor rigid 3D optimizer together with<br>
&gt;&gt; the<br>
&gt;&gt; &gt; &quot;CenteredTransformInitializer&quot;.<br>
&gt;&gt; &gt; I know that the difference in results are due to the way I read the data.<br>
&gt;&gt; If<br>
&gt;&gt; &gt; I change the input from memory to reading the dicom files I get the same<br>
&gt;&gt; &gt; result as with a stand-alone .exe-application, so this is where the error<br>
&gt;&gt; &gt; is.<br>
&gt;&gt; &gt; Does anyone have any idea as to what other information I need to pass<br>
&gt;&gt; from<br>
&gt;&gt; &gt; matlab to get identical results?<br>
&gt;&gt; &gt; Thanks in advance<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt; Patrik Brynolfsson<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _____________________________________<br>
&gt;&gt; &gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; &gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Patrik Brynolfsson<br>
</div></div>&gt; -------------- next part --------------<br>
&gt; An HTML attachment was scrubbed...<br>
&gt; URL: &lt;<a href="http://www.itk.org/pipermail/insight-users/attachments/20090916/f0f7f731/attachment.htm" target="_blank">http://www.itk.org/pipermail/insight-users/attachments/20090916/f0f7f731/attachment.htm</a>&gt;<br>

&gt;<br>
&gt; ------------------------------<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Insight-users mailing list<br>
&gt; <a href="mailto:Insight-users@itk.org">Insight-users@itk.org</a><br>
<div class="im">&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;<br>
&gt;<br>
</div>&gt; End of Insight-users Digest, Vol 65, Issue 56<br>
&gt; *********************************************<br>
&gt;<br>
</blockquote></div><br><br clear="all"><br>-- <br>Patrik Brynolfsson<br><br><br>
</div></div>