[Insight-users] Computing the gradient in the Metric?

motes motes mort.motes at gmail.com
Sun Sep 6 10:10:45 EDT 2009


Ok I am trying to do the metric E differentiation by hand:

E = \sum[F(x) - M(T(p,x))]^2
   = t^2

where:

t = F(x) - M(T(p,x))

dE/dp = 2t * dt/dp

where:

dt/dp = dM(T(p,x))/dp

since the fixed image is treated as a constant because we are
differentiating with respect to the parameters p.


Now I think I understand why its the gradient of the moving image that
is used. But how are the Jacobian introduced in:

dt/dp = dM(T(p,x))/dp

?




On Sun, Sep 6, 2009 at 3:30 PM, motes motes<mort.motes at gmail.com> wrote:
> Thanks for the hint I have read those pages but I still have two
> questions to the below expression:
>
>          sum += 2.0 * diff * jacobian( dim, par ) * gradient[dim];
>
> 1) In the above expression gradient[dim] corresponds to the gradient
> for the current pixel in the moving image? On page 249 in the "Insight
> Into Images" this is the first term in (10.6). But why are the
> gradient of the moving image used to compute the derivative of the
> metric? I know this is a very basic question but I still cannot see
> the connection.
>
> 2) When I debug the code the jacobian actually just contains the
> weights (computed using the transform kernel) for each node in the
> support region. But are the jacobian not supposed to contain the first
> order partial derivatives? It seems a bit confusing that the jacobian
> is used as a container for the kernel transform weights.
>
>
>
>
>
> On Sun, Sep 6, 2009 at 1:01 PM, Neuner Markus<neuner.markus at gmx.net> wrote:
>> Hi,
>>
>> To understand why the jacobian is used i would suggest to read pages 249-251
>> in the Book "Insight Into Images" by Terry S. Yoo. Ther eis described how
>> and why the jacobian is used.
>>
>> Greets
>>
>> motes motes wrote:
>>>
>>> In itkMeanSquaresImageToImageMetric.txx the metric value and the
>>> gradient is computed. I pretty much understand how the metric value is
>>> computed but am a bif confused on how the gradient is computed:
>>>
>>>
>>>
>>>
>>>      const RealType movingValue  = this->m_Interpolator->Evaluate(
>>> transformedPoint );
>>>      const TransformJacobianType & jacobian =
>>> this->m_Transform->GetJacobian( inputPoint );
>>>      const RealType fixedValue     = ti.Value();
>>>      this->m_NumberOfPixelsCounted++;
>>>      const RealType diff = movingValue - fixedValue;
>>>      measure += diff * diff;
>>>
>>>      for(unsigned int par=0; par<ParametersDimension; par++)
>>>        {
>>>        RealType sum = NumericTraits< RealType >::Zero;
>>>        for(unsigned int dim=0; dim<ImageDimension; dim++)
>>>          {
>>>          sum += 2.0 * diff * jacobian( dim, par ) * gradient[dim];
>>>          }
>>>        derivative[par] += sum;
>>>        }
>>>      }
>>>
>>> It basically comes down to this line:
>>>
>>>
>>>
>>>          sum += 2.0 * diff * jacobian( dim, par ) * gradient[dim];
>>>
>>> why is the jacobian multiplied with the current gradient?
>>> _____________________________________
>>> 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
>>>
>>>
>>
>


More information about the Insight-users mailing list