Hello,<br><br>I`m trying to align two images in analyze format. However, the output is always a blank image with a black line (always in the same place - around the top of the image). <br>I use the class itkImageFileReader to read the two images and I don`t think the problem is related with it. I think there`s something missing, but don`t know what.<br>
<br>Here is my sourcecode: (C++)<br><br>void Alinhador::alinhar() {<br>    const    unsigned int    Dimension = 3;<br>    typedef  short           PixelType;<br><br>    // TIPOS<br>    typedef itk::VersorRigid3DTransform&lt; double &gt; TransformType;<br>
    typedef itk::RegularStepGradientDescentOptimizer       OptimizerType;<br>    typedef itk::MattesMutualInformationImageToImageMetric&lt;ImageType, ImageType&gt; MetricType;<br>    typedef itk::LinearInterpolateImageFunction&lt;ImageType, double&gt; InterpolatorType;<br>
    typedef itk::ImageRegistrationMethod&lt; ImageType, ImageType &gt; RegistrationType;<br><br>    //INSTANCIAS<br>    MetricType::Pointer metric = MetricType::New();<br>    OptimizerType::Pointer optimizer = OptimizerType::New();<br>
    InterpolatorType::Pointer interpolator = InterpolatorType::New();<br>    TransformType::Pointer transform = TransformType::New();<br>    RegistrationType::Pointer registration  = RegistrationType::New();<br><br>    metric-&gt;UseAllPixelsOn(); <br>
<br>    registration-&gt;SetMetric(metric);<br>    registration-&gt;SetOptimizer(optimizer);<br>    registration-&gt;SetInterpolator(interpolator);<br>    registration-&gt;SetTransform(transform );<br><br>    registration-&gt;SetFixedImage(this-&gt;fixedImage);<br>
    registration-&gt;SetMovingImage(this-&gt;movingImage);<br>    this-&gt;fixedImage-&gt;Update();<br><br>    registration-&gt;SetFixedImageRegion( this-&gt;fixedImage-&gt;GetBufferedRegion() );<br><br><br>    //INITIALIZER<br>
    typedef itk::CenteredTransformInitializer&lt; TransformType, ImageType, ImageType &gt;  TransformInitializerType;<br>    TransformInitializerType::Pointer initializer = TransformInitializerType::New();<br><br>    initializer-&gt;SetTransform(   transform );<br>
    initializer-&gt;SetFixedImage(this-&gt;fixedImage );<br>    initializer-&gt;SetMovingImage(this-&gt;movingImage );<br>    //initializer-&gt;GeometryOn();<br>    initializer-&gt;MomentsOn();<br><br>    initializer-&gt;InitializeTransform();<br>
<br>    registration-&gt;SetInitialTransformParameters( transform-&gt;GetParameters() );<br><br>    typedef OptimizerType::ScalesType       OptimizerScalesType;<br>    OptimizerScalesType optimizerScales( transform-&gt;GetNumberOfParameters() );<br>
    const double translationScale = 1.0 / 1000.0;<br><br>    std::cout&lt;&lt; transform-&gt;GetNumberOfParameters() &lt;&lt; std::endl;<br>    optimizerScales[0] = 1.0;<br>    optimizerScales[1] = 1.0;<br>    optimizerScales[2] = 1.0;<br>
    optimizerScales[3] = translationScale;<br>    optimizerScales[4] = translationScale;<br>    optimizerScales[5] = translationScale;<br><br>    optimizer-&gt;SetScales( optimizerScales );<br><br>    optimizer-&gt;SetMaximumStepLength( 1.0  ); <br>
    optimizer-&gt;SetMinimumStepLength( 0.06 );<br><br>    optimizer-&gt;SetNumberOfIterations( 100 );<br><br><br>    CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();<br>    optimizer-&gt;AddObserver( itk::IterationEvent(), observer );<br>
<br><br>    try <br>    { <br>        registration-&gt;StartRegistration(); <br>    } <br>    catch( itk::ExceptionObject &amp; err ) <br>    { <br>        std::cerr &lt;&lt; &quot;ExceptionObject caught !&quot; &lt;&lt; std::endl; <br>
        std::cerr &lt;&lt; err &lt;&lt; std::endl; <br>        return;<br>    } <br><br>    OptimizerType::ParametersType finalParameters = <br>        registration-&gt;GetLastTransformParameters();<br><br><br>    const double versorX              = finalParameters[0];<br>
    const double versorY              = finalParameters[1];<br>    const double versorZ              = finalParameters[2];<br>    const double finalTranslationX    = finalParameters[3];<br>    const double finalTranslationY    = finalParameters[4];<br>
    const double finalTranslationZ    = finalParameters[5];<br><br>    const unsigned int numberOfIterations = optimizer-&gt;GetCurrentIteration();<br><br>    const double bestValue = optimizer-&gt;GetValue();<br><br>    transform-&gt;SetParameters( finalParameters );<br>
<br>    TransformType::MatrixType matrix = transform-&gt;GetRotationMatrix();<br>    TransformType::OffsetType offset = transform-&gt;GetOffset();<br><br>    std::cout &lt;&lt; &quot;Matrix = &quot; &lt;&lt; std::endl &lt;&lt; matrix &lt;&lt; std::endl;<br>
    std::cout &lt;&lt; &quot;Offset = &quot; &lt;&lt; std::endl &lt;&lt; offset &lt;&lt; std::endl;<br><br><br>    TransformType::Pointer finalTransform = TransformType::New();<br><br>    finalTransform-&gt;SetCenter( transform-&gt;GetCenter() );<br>
<br>    finalTransform-&gt;SetParameters( finalParameters );<br><br>    resampler = ResampleFilterType::New();<br><br>    resampler-&gt;SetTransform( finalTransform );<br>    resampler-&gt;SetInput( this-&gt;movingImage );<br>
<br>    ImageType::Pointer fixedImage = this-&gt;fixedImage;<br><br>    resampler-&gt;SetSize(    fixedImage-&gt;GetLargestPossibleRegion().GetSize() );<br>    resampler-&gt;SetOutputOrigin(  fixedImage-&gt;GetOrigin() );<br>
    resampler-&gt;SetOutputSpacing( fixedImage-&gt;GetSpacing() );<br>    resampler-&gt;SetDefaultPixelValue( 100 );<br>}<br><br>