[Insight-users] 3 questions (FFT filters)
Jakub Bican
jakub.bican at matfyz.cz
Sun Sep 17 14:44:24 EDT 2006
Thanks Luis,
1) now, i fixed the code a little bit to the FFTW, but this is just a
intermediate state during development.
I like the idea with factories and i will focus on that.
But there always must be something in the factory, that decides which
filter to create, if both are available...
2) Perfect - the NumericTraits<>::RealType is the solution!
side question - why it is necessary to use the trick
itkStaticConstMacro(ImageDimension, unsigned int,
::itk::GetImageDimension<TInputImage>::ImageDimension );
instead of using
itkStaticConstMacro(ImageDimension, unsigned int,
ImageType::ImageDimension);
?? (i am using the second option and it works)
3) This is used just in the test - i was not looking for the safest way;)
Thanks again,
Jakub
Luis Ibanez napsal(a):
>
> 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