Hi,

I'm using the new EnableIfC and DisableIfC routines, to try and optimize 
itkCentralDifferenceImageFunction::Evaluate* methods by specializing for scalar 
and vector pixel types. I have it working using my own SFINAE method I pulled 
off the web. But this, requires calling templated subfunctions, which cost 
about 2% in overhead.


Looking at itkEnableIf.h and its usage in PatchBasedDenoisingImageFilter, I was 
hoping to be able to call the specialized Evalute* methods directly.


The method PatchBasedDenoisingImageFilter::GetComponent is are 
template-specialized to use one of two versions depending on whether the pixel 
is scalar or not. The method is templated.
But in 
PatchBasedDenoisingImageFilter::ComputeSignedEuclideanDifferenceAndWeightedSquaredNorm(),
 GetComponent is called without any template parameters. How does this work? I 
must be missing something.




template 
void
PatchBasedDenoisingImageFilter
::ComputeSignedEuclideanDifferenceAndWeightedSquaredNorm(const PixelType& a, 
const PixelType& b,
 const RealArrayType& weight,
 bool itkNotUsed(useCachedComputations),
 SizeValueType itkNotUsed(cacheIndex),
 EigenValuesCacheType& itkNotUsed(eigenValsCache),
 EigenVectorsCacheType& itkNotUsed(eigenVecsCache),
 RealType& diff, RealArrayType& norm)
{
 for (unsigned int pc = 0; pc < m_NumPixelComponents; ++pc)
 {
 RealValueType tmpDiff = GetComponent(b, pc) - GetComponent(a, pc);
 RealValueType tmpWeight = weight[pc];
 SetComponent(diff, pc, tmpDiff);
 norm[pc] = tmpWeight * tmpWeight * tmpDiff * tmpDiff;
 }
}

_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php

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-developers

Reply via email to