00001
00022 #ifndef DGVTRANSFORM_H
00023 #define DGVTRANSFORM_H
00024
00026 #include "DGVImage.h"
00027 #include "DGVConsole.h"
00028
00030 #include "DGVRadonTransform.h"
00031 #include "DGVFourierTransform.h"
00032
00034 enum transformType {None = 0, FFT, iFFT, FFT_Real, iFFT_Real, FFT_1D, iFFT_1D, FFT_Real_1D, iFFT_Real_1D,
00035 FFT_1D_Batch, iFFT_1D_Batch, FFT_Real_1D_Batch, iFFT_Real_1D_Batch,
00036 radonSlicing, radonSlicing_Real, FRT, iFRT, iFRT_Unscaled};
00037
00046 class DGV_EXPORT DGVTransform : public QThread
00047 {
00048 Q_OBJECT
00049
00050 public:
00051 DGVTransform(QObject *parent = 0);
00052 virtual ~DGVTransform();
00053
00058 inline void setName(QString newName)
00059 { name = newName; }
00064 inline QString getName()
00065 { return name; }
00066
00073 void frt(DGVImage *image);
00078 void frt(Array<imageType,2> &image);
00083 void ifrt(DGVImage *bins);
00088 void ifrt(Array<imageType,2> &bins);
00093 void ifrtUnscaled(DGVImage *image);
00098 void ifrtUnscaled(Array<imageType,2> &bins);
00100
00107 void fft(Array<complex<imageType>,2> &image);
00112 void ifft(Array<complex<imageType>,2> &kSpace);
00117 void fft_real(Array<imageType,2> &image);
00122 void ifft_real(Array<complex<imageType>,2> &kSpace);
00127 void fft_1D(Array<complex<imageType>,1> &image);
00132 void fft_1D(Array<complex<imageType>,2> &image);
00137 void ifft_1D(Array<complex<imageType>,1> &kSpace);
00142 void ifft_1D(Array<complex<imageType>,2> &kSpace);
00147 void fft_real_1D(Array<imageType,1> &image);
00152 void fft_real_1D(Array<imageType,2> &image);
00157 void ifft_real_1D(Array<complex<imageType>,1> &kSpace);
00162 void ifft_real_1D(Array<complex<imageType>,2> &kSpace);
00167 void radonSlices(Array<complex<imageType>,2> &kSpace);
00172 void radonSlices(Array<imageType,2> &kSpace);
00174
00181 void reset();
00186 inline void shiftDC(Array<imageType,2> &kSpace)
00187 { kSpace = Fourier.shiftDC(kSpace); }
00192 inline void shiftDC(Array<complex<imageType>,2> &kSpace)
00193 { kSpace = Fourier.shiftDC(kSpace); }
00198 inline void normalise(Array<imageType,2> &kSpace)
00199 { Fourier.normalise(kSpace); }
00204 inline void normalise(Array<complex<imageType>,2> &kSpace)
00205 { Fourier.normalise(kSpace); }
00210 inline void alwaysWaitTillComplete(bool waitTillComplete)
00211 { alwaysWait = waitTillComplete; }
00216 DGVImage* getImageResult()
00217 { return resultImage; }
00223 void setConsole(DGVConsole *newConsole);
00225
00226 signals:
00231 void resultAvailable(DGVImage *);
00236 void resultAvailable(Array<imageType,1> , QString);
00241 void resultAvailable(Array<imageType,2> , QString);
00246 void resultAvailable_1D(Array<imageType,2> , QString);
00251 void resultAvailable(Array< complex<imageType>,1 > , QString);
00256 void resultAvailable(Array< complex<imageType>,2 > , QString);
00261 void resultAvailable_1D(Array< complex<imageType>,2 > , QString);
00262
00263 protected:
00264 QMutex mutex;
00265 QWaitCondition condition;
00266 bool abort;
00267 bool alwaysWait;
00268 bool consoleAssigned;
00269 QString name;
00270
00271 transformType transform;
00272 Array<imageType,1> *inData_1D;
00273 Array<imageType,1> *outData_1D;
00274 Array<imageType,2> *inData;
00275 Array<imageType,2> *outData;
00276 Array<complex<imageType>,1> *inComplexData_1D;
00277 Array<complex<imageType>,1> *outComplexData_1D;
00278 Array<complex<imageType>,2> *inComplexData;
00279 Array<complex<imageType>,2> *outComplexData;
00280
00281 Array<complex<imageType>,2> fftSpace;
00282 Array<imageType,2> frtSpace;
00283
00284 Array<complex<imageType>,1> fftSpace_1D;
00285 Array<imageType,1> frtSpace_1D;
00286
00287 DGVRadonTransform<imageType> RT;
00288 DGVFourierTransform<imageType,1> Fourier_1D;
00289 DGVFourierTransform<imageType,2> Fourier;
00290
00291 DGVImage *resultImage;
00292 DGVConsole *console;
00293
00298 void run();
00299 };
00300
00301
00302
00303 #endif // DGVTRANSFORM_H