2012-04-22 5 views
4

OpenCV 및 이미지 처리 알고리즘의 새로운 기능입니다. C++에서 OpenCV에서 역 이산 푸리에 변환을 수행해야하지만 어떻게해야할지 모르겠다. 인터넷을 통해 검색 한 결과 답변을 찾지 못했습니다. 이 코드에서 내 프로그램에서 푸리에 변환을 수행하고 있습니다 : http://opencv.itseez.com/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html. 나는 그 코드에 대해 역관계를 시도했지만, 내가 어디에서 잘못하고 있는지 알지 못한다. 내 코드는 여기 (I는 전체 코드가 잘못이라고 생각) : 사실OpenCV의 역 푸리에 변환

void doFourierInverse(const Mat &src, Mat &dst) { 
    normalize(src, dst, 0, -1, CV_MINMAX); 

    int cx = dst.cols/2; 
    int cy = dst.rows/2; 

    Mat q0(dst, Rect(0, 0, cx, cy)); 
    Mat q1(dst, Rect(cx, 0, cx, cy)); 
    Mat q2(dst, Rect(0, cy, cx, cy)); 
    Mat q3(dst, Rect(cx, cy, cx, cy)); 

    Mat tmp;   
    q0.copyTo(tmp); 
    q3.copyTo(q0); 
    tmp.copyTo(q3); 

    q1.copyTo(tmp);  
    q2.copyTo(q1); 
    tmp.copyTo(q2); 

    dst = dst(Rect(0, 0, dst.cols & -2, dst.rows & -2)); 

    exp(dst, dst); 
    dst -= Scalar::all(1); 

    Mat planes[2]; 

    polarToCart(dst, Mat::zeros(dst.rows, dst.cols, dst.type()), planes[0], planes[1]); 

    merge(planes, 2, dst);  

    idft(dst, dst, DFT_INVERSE | DFT_SCALE); 

    split(dst, planes); 

    dst = planes[0]; 
} 
+0

코드 및/또는 생성 된 결과와 정확히 "잘못"하다고 생각합니까? –

+0

나는 함수 polarToCart가 함수의 크기에 반비례하지 않다고 생각한다. –

답변

16

, 당신은 다른 사분면을 교환 할 필요가 없습니다, 당신은 인간이고 더 자연스러운 시각화를하려는 경우에만이 필요한 FFT 결과 (즉, 중간 주파수가 0, 음수가 왼쪽/아래, 양수가 오른쪽/위).

FFT를 반전하려면 "현재 상태 그대로"(또는 원하는 주파수 필터링 후) 순방향 변환 결과를 동일한 DFT() 함수에 전달하고 DFT_INVERSE 플래그 만 추가해야합니다. 당신은 FFT, 전후 변환 수립에 매우 빡빡 꼬임이 약 수학 ...

--- 편집 ---

정확히 무엇을 작동하지 않습니다을 기억한다면? 다음 코드는 forward-then-backward FFT를 수행하며 모든 것이 잘 작동합니다.

// Load an image 
cv::Mat inputImage = cv::imread(argv[argc-1], 0); 

// Go float 
cv::Mat fImage; 
inputImage.convertTo(fImage, CV_32F); 

// FFT 
std::cout << "Direct transform...\n"; 
cv::Mat fourierTransform; 
cv::dft(fImage, fourierTransform, cv::DFT_SCALE|cv::DFT_COMPLEX_OUTPUT); 

// Some processing 
doSomethingWithTheSpectrum(); 

// IFFT 
std::cout << "Inverse transform...\n"; 
cv::Mat inverseTransform; 
cv::dft(fourierTransform, inverseTransform, cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT); 

// Back to 8-bits 
cv::Mat finalImage; 
inverseTransform.convertTo(finalImage, CV_8U); 
+0

고마워, 나는 코드 때문에 내 게시물에 대한 내 답변을 다른 게시물에 썼다. –

+0

감사합니다.이 도움이되었습니다. –

+0

우리는 저주파수를 제거하고자하는 것처럼 로우 패스 또는 하이 패스 필터를 적용하는 방법, FFT의 자연스럽게 보이는 시각의 중간에있는 주파수를 제거합니다. –