Convolution và DFT

Một phần của tài liệu CHƯƠNG 6 Image Transforms doc (Trang 26 - 27)

Có khả năng để tăng mạnh tốc độ của convolution bởi dùng DFT qua lý thuyết convolution

[Titchmarsh26] mà liên quan convolution trong miền không gian thành nhân trong miền Fourier [Morse53; Bracewell65; Arfk en85].* Để hoàn thành điều này, cái đầu tiên tính biến đổi Fourier của image và sau đó biến đổi Fourier của convolution filter. Một khi điều này được làm, convolution có thể được thực hiện trong không gian biến đổi theo thời gian tuyến tính với sự tơn trọng số các pixel trong ảnh. Điều đáng để quan sát source code để tính một convolution như thế, như nó cũng sẽ cung cấp ta với nhiều ví dụ tốt của dùng cvDFT(). Code được thấy trong Example 6-5, mà được lấy trực tiếp từ OpenCV reference.

Example 6-5. dùng of cvDFT () to accelerate the computation of convolutions

// dùng DFT to accelerate the convolution of array A by kernel B. // Place kết quả in array V.

//

void speedy_convolution(

const CvMat* A, // Size: M1xN1 const CvMat* B, // Size: M2xN2

CvMat* C // Size:(A->rows+B->rows-1)x(A->cols+B->cols-1) ) {

int DFT_M = cvGetOptimalDFT Size( A->rows+B->rows-1 ); int DFT_N = cvGetOptimalDFT Size( A->cols+B->cols-1 ); CvMat* DFT_A = cvCreateMat( DFT_M, DFT_N, A->type ); CvMat* DFT_B = cvCreateMat( DFT_M, DFT_N, B->type ); CvMat tmp;

// copy A to DFT_A và pad DFT_A with zeros //

cvGetSubRect( DFT_A, &tmp, cvRect(0,0,A->cols,A->rows)); cvCopy( A, &tmp );

cvGetSubRect( DFT_A, &tmp,

cvRect( A->cols, 0, DFT _A->cols-A->cols, A->rows ) );

cvZero( &tmp );

// no need to pad bottom part of DFT _A with zeros vì of // dùng nonzero_rows parameter in cvDFT () call below //

cvDFT ( DFT _A, DFT _A, CV_DXT_FORWARD, A->rows ); // repeat the same with the second array

//

cvGetSubRect( DFT _B, &tmp, cvRect(0,0,B->cols,B->rows) ); cvCopy( B, &tmp );

cvGetSubRect( DFT _B, &tmp,

cvRect( B->cols, 0, DFT _B->cols-B->cols, B->rows ) );

cvZero( &tmp );

// no need to pad bottom part of DFT _B with zeros vì of // dùng nonzero_rows parameter in cvDFT () call below //

cvDFT ( DFT _B, DFT _B, CV_DXT_FORWARD, B->rows );

// hay CV_DXT_MUL_CONJ to get correlation rather than convolution //

cvMulSpectrums( DFT _A, DFT _B, DFT _A, 0 ); // calculate only the top part

//

cvDFT ( DFT _A, DFT _A, CV_DXT_INV_SCALE, C->rows );

cvGetSubRect( DFT _A, &tmp, cvRect(0,0,conv->cols,C->rows) ); cvCopy( &tmp, C );

cvReleaseMat( DFT _A ); cvReleaseMat( DFT _B ); }

Trong Example 6-5 ta có thể thấy rằng các input array đầu tiên được tạo và sau đó initialized. Tiếp theo, hai arrays mới được tạo mà các chiều là tối ưu cho thuật toán DFT . Các array ban đầu được chép vào những aray mới này và sau đó các biến đổi được tính. Cuối cùng, spectra được nhân cùng nhau cùng nhau và biến đổi ngược được áp dụng cho sản phẩm. Các biến đổi là phần chậm nhất của tác vụ này; một N-by-N image mất O(N 2 log N) thời gian và do đó tồn bộ tiến trình cũng được hồn thành ở thời gian đó (giả thiết rằng N > M cho một lõi convolution M-by-M). Thời gian này là nhanh hơn nhiều so với O(N2M 2), thời gian non- DFT convolution đòi hỏi bởi phương pháp tự nhiên hơn.

Một phần của tài liệu CHƯƠNG 6 Image Transforms doc (Trang 26 - 27)

Tải bản đầy đủ (DOC)

(35 trang)
w