[Insight-users] 3 questions (FFT filters)
Luis Ibanez
luis.ibanez at kitware.com
Sun Sep 17 11:08:19 EDT 2006
Hi Jakub,
1) Here are two options:
1.1) Use only VNL: Since the known bugs in the vnl FFT
have been fixed, you could simply rely on the VNL
implementation that is distributed along with ITK.
1.2) Use a Factory for bringing up VNL or FFTW at run
time. This is probably a more elegant option but
also a bit more involved. You will find instructions
on how to create Factories in the following tutorial:
http://www.na-mic.org/Wiki/images/2/24/Insight-DesignPatterns.ppt
The source code examples for that Tutorial can be found at:
http://www.na-mic.org/Wiki/index.php/Image:ITKCourseExercises.zip
With the factory mechanism you simpy define a common
API for both the VNL and FFTW (or other) implementations
and delegate the the last minute at run time the decision
on which implementation to use. The user simply have to
register the appropriate factory with the FactoryBase.
2) You can easily overcome this problem by using Traits.
You could simply use the RealType pixel trait defined
in itkNumericTraits.h
Like:
typedef typename TInputImage::PixelType InputPixelType;
typedef itk::NumericTraits<InputPixelType>::RealType
InternalFFTPixelType;
For PixelTypes less than float, the RealType is float,
while for float and double images it is Double.
If that type distribution is not the want that you find
appropriate, then you could define your own local traits.
Something like FFTRealTypeTraits<>.
Note that for "Dimension" you need a trick for getting
the dimension out of the Input image.
/** Image dimension. */
itkStaticConstMacro(ImageDimension, unsigned int,
::itk::GetImageDimension<TInputImage>::ImageDimension );
Finally you have the two elements needed for instantiating
the image template:
typedef itk::Image<
InternalFFTPixelType,
itkGetStaticConstMacro(ImageDimension) >
InternalFFTImageType;
3) It is safer to use the trait that the image itself offers
for the Origin:
typename TInputImage::PointType origin;
movingImage->SetOrigin( origin );
Note that you should *NOT* do this if the movingImage is
the output of another filter. In such case you should
rather us the ChangeInformationImageFilter.
Regards,
Luis
====================
Jakub Bican wrote:
>
> Hello,
>
> i am writing a new filter and i am facing following problems. The first
> two problems are rather philosophic, while the last one is a compilation
> error.
>
> Thanks very much for the answers and advices,
> Jakub
>
>
> 1) choosing class for FFT
> My filter is a mini-pipeline filter, that needs to perform FFT and IFFT
> at several points of computation. As far as i know, there are two
> possibilities for making FFT and IFFT - use fftw or vnl.
>
> I want to write the filter as general as possible, so i don't want it to
> be dependent on any of these exchangeable(?) possibilities. I consider
> these options:
> a) use constantly only fftw OR vnl (but which one of these should be
> preffered in this case? and what of fftw is not available?)
> b) choose the one, which is available during compilation ( I am not
> sure how is this manageable now - if something like #ifdef USE_FFTW...
> can be used, and which possiblity should be preffered if both are
> available. )
> c) let the user specify the possibility (e.g. filter->UseFFTWOn() ?)
> b) let the user pass in the filter (e.g.
> filter->SetRealToComplexConjugateFilter(...)) - this is very unhandy, as
> the filter uses several instances of FFT and IFFT filters
>
> 2) Instantiating FFT filter templates
> My filter is templated over input image type, but internally, i need to
> compute FFT in floating point - float should be enough for my
> computations. So there will be cast filter at the begginning of the
> mini-pipeline, that will cast arbitrary input data type to my internal
> floating point type - float.
>
> But what if user passes in a double data? Than there is a risk while
> casting data to float...
>
> But if i use internally double, then i will be wasting resources for all
> "smaller" data types.
>
> Again, if there will be a template parameter that will determine this,
> then the user will have to set something, that is internal for the filter.
>
> 3) impossible to pass origin into image
> I need to manually set an origin of an image:
> double origin[ Dimension ];
> for (unsigned int i = 0; i < Dimension; i++)
> {
> origin[i] = 0.0;
> }
> movingImage->SetOrigin(origin);
>
> during compilation, i get following error:
> test.cxx(109): error C2663: 'itk::ImageBase<VImageDimension>::SetOrigin'
> : 3 overloads have no legal conversion for 'this' pointer
> with
> [
> VImageDimension=2
> ]
>
> I am compiling on WinXP+MSVS.NET (2003)
>
>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
>
>
More information about the Insight-users
mailing list