[Insight-users] Vital DICOM information/tags when registering images?

Bill Lorensen bill.lorensen at gmail.com
Wed Sep 16 08:29:17 EDT 2009


Have you tried comparing the images pixel by pixel?

On Wed, Sep 16, 2009 at 3:02 AM, Patrik Brynolfsson
<patrik.brynolfsson at gmail.com> wrote:
> Hello Bill, thanx for answering!
> The filter I use are:
> Registration part (same for both cases):
> itkImageRegistrationMethod
> itkMattesMutualInformationImageToImageMetric
> itkLinearInterpolateImageFunction
> itkVersorRigid3DTransform
> itkVersorRigid3DTransformOptimizer
> itkCenteredTransformInitializer
> Reading images from memory:
> itkImportImageFilter
> itkChangeInformationImageFilter
> Reading images from DICOM:
> itkImageSeriesReader
> itkGDCMImageIO
> itkGDCMSeriesFileNames
> The code to read images from memory is:
>   typedef itk::ImportImageFilter<PixelType,Dimension> ImportFilterType;
>   ImportFilterType::Pointer fixedImageReader = ImportFilterType::New();
>   ImportFilterType::Pointer movingImageReader = ImportFilterType::New();
>   const mwSize*   dimsFix = mxGetDimensions(prhs[0]);
>   const mwSize*   dimsMov = mxGetDimensions(prhs[1]);
>   ImportFilterType::SizeType sizeFix;
>   ImportFilterType::SizeType sizeMov;
>   sizeFix[0] = dimsFix[0];
>   sizeFix[1] = dimsFix[1];
>   sizeFix[2] = dimsFix[2];
>   sizeMov[0] = dimsMov[0];
>   sizeMov[1] = dimsMov[1];
>   sizeMov[2] = dimsMov[2];
>   ImportFilterType::IndexType start;
>   start.Fill( 0 );
>   ImportFilterType::RegionType regionFix;
>   regionFix.SetIndex( start );
>   regionFix.SetSize(  sizeFix  );
>   ImportFilterType::RegionType regionMov;
>   regionMov.SetIndex( start );
>   regionMov.SetSize(  sizeMov  );
>   fixedImageReader->SetRegion( regionFix );
>   movingImageReader->SetRegion(regionMov );
>   //Import image from memory, passed from MATLAB
>   fixedImageReader->SetImportPointer((PixelType*)mxGetData(prhs[0]),mxGetNumberOfElements(prhs[0]),false);
>   movingImageReader->SetImportPointer((PixelType*)mxGetData(prhs[1]),mxGetNumberOfElements(prhs[1]),false);
>   fixedImageReader->Update();
>   movingImageReader->Update();
> ...and the code to set the relevant info is:
>   double *fixedSpacingInput    = mxGetPr(prhs[2]);
>   double *movingSpacingInput = mxGetPr(prhs[3]);
>   double *fixedOrientationInput = mxGetPr(prhs[4]);
>   double *movingOrientationInput = mxGetPr(prhs[5]);
>   double *fixedOriginInput = mxGetPr(prhs[6]);
>   double *movingOriginInput = mxGetPr(prhs[7]);
>   **Code for casting input to correct types are skipped, not important for
> this question**
>   typedef itk::ChangeInformationImageFilter< FixedImageType >
> ChangeInfoType;
>   ChangeInfoType::Pointer changeFixedInfo = ChangeInfoType::New();
>   ChangeInfoType::Pointer changeMovingInfo = ChangeInfoType::New();
>   changeFixedInfo->SetInput(fixedImageReader->GetOutput());
>   changeMovingInfo->SetInput(movingImageReader->GetOutput());
>   changeFixedInfo->SetOutputSpacing(fixedSpacing);
>   changeMovingInfo->SetOutputSpacing(movingSpacing);
>   changeFixedInfo->SetChangeSpacing(true);
>   changeMovingInfo->SetChangeSpacing(true);
>   changeFixedInfo->SetOutputDirection(fixedOrientation);
>   changeMovingInfo->SetOutputDirection(movingOrientation);
>   changeFixedInfo->SetChangeDirection(true);
>   changeMovingInfo->SetChangeDirection(true);
>   changeFixedInfo->SetOutputOrigin(fixedOrigin);
>   changeMovingInfo->SetOutputOrigin(movingOrigin);
>   changeFixedInfo->SetChangeOrigin(true);
>   changeMovingInfo->SetChangeOrigin(true);
>   changeFixedInfo->Update();
>   changeMovingInfo->Update();
>   registration->SetFixedImage(    changeFixedInfo->GetOutput()    );
>   registration->SetMovingImage(   changeMovingInfo->GetOutput()   );
>   registration->SetFixedImageRegion( changeFixedInfo->GetOutput()->GetBufferedRegion()
> );
> As a check I print the origin, spacing and direction for the images and they
> are identical to when reading from DICOM files. I read the DICOM series just
> as described in chapter 7.12 in the ITK manual.
> Any ideas to what might be wrong here?
> Thanks in advance!
> //Patrik Brynolfsson
>
>
> 2009/9/16 Bill Lorensen <bill.lorensen at gmail.com>
>>
>> You should get the same answers. Exactly what filters are you using in
>> each of the cases. I can't tell from your description.
>>
>> Bill
>>
>> On Tue, Sep 15, 2009 at 4:38 PM, Patrik Brynolfsson
>> <patrik.brynolfsson at gmail.com> wrote:
>> > Hello,
>> > I'm working on a Matlab mex-implementation of an ITK registration. This
>> > means that instead of loading the images from files I will load them
>> > from
>> > memory as 3D matrices. All the DICOM information needs to be passed to
>> > ITK
>> > from Matlab as well, and this is where my problems begin. The
>> > information
>> > that I thought was essential for a correct registration is:
>> > * Origin
>> > * Spacing
>> > * Direction
>> > I set these using the "ChangeInformationImageFilter" and it is working;
>> > the
>> > images have the origin, spacing and directional cosines that are
>> > assigned to
>> > them, and they are the same as if the dicom images were loaded from
>> > files.
>> > However, the result of the registration is different from that when
>> > loading
>> > the images from files, with all other components set the same, (of
>> > course I
>> > reinitialize the seed). Not by much, but they should be exactly the
>> > same! I
>> > use Mattes mutual information metric, linear interpolation, Versor rigid
>> > 3D
>> > transform and the accompanying Versor rigid 3D optimizer together with
>> > the
>> > "CenteredTransformInitializer".
>> > I know that the difference in results are due to the way I read the
>> > data. If
>> > I change the input from memory to reading the dicom files I get the same
>> > result as with a stand-alone .exe-application, so this is where the
>> > error
>> > is.
>> > Does anyone have any idea as to what other information I need to pass
>> > from
>> > matlab to get identical results?
>> > Thanks in advance
>> > --
>> > Patrik Brynolfsson
>> >
>> >
>> >
>> > _____________________________________
>> > Powered by www.kitware.com
>> >
>> > Visit other Kitware open-source projects at
>> > http://www.kitware.com/opensource/opensource.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
>> >
>> >
>
>
>
> --
> Patrik Brynolfsson
>
>
>


More information about the Insight-users mailing list