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