2012-03-06 3 views
2

올바른 패딩 크기를 결정한 후에 가우스 고역 통과 필터를 만들려고합니다 (예 : 이미지 너비와 높이가 10X10이고 20X20이어야 함).OpenCV에서 DFT 출력에 가우스 필터를 적용하는 방법

OpenCV에서 포트를 연결하려고하는 MATLAB 코드가 있는데 제대로 포팅하는 데 어려움이 있습니다.

f1_seg = imread('thumb1-small-test.jpg'); 

Iori = f1_seg; 


% Iori = imresize(Iori, 0.2); 

%Convert to grayscale 
I = Iori; 
if length(size(I)) == 3 
    I = rgb2gray(Iori); 
end 
% 

%Determine good padding for Fourier transform 

PQ = paddedsize(size(I)); 

I = double(I); 

%Create a Gaussian Highpass filter 5% the width of the Fourier transform 

D0 = 0.05*PQ(1); 

H = hpfilter('gaussian', PQ(1), PQ(2), D0); 

% Calculate the discrete Fourier transform of the image. 

F=fft2(double(I),size(H,1),size(H,2)); 

% Apply the highpass filter to the Fourier spectrum of the image 

HPFS_I = H.*F; 

내가 OpenCV의에서 DFT를 사용하는 방법을 알고, 나는 그것의 이미지를 생성 할 수 있어요,하지만 난 가우시안 필터를 작성하는 방법을 잘 모르겠습니다 : 내 MATLAB 코드는 아래에 표시됩니다. 위에 표시된 것처럼 고역 통과 가우스 필터를 어떻게 만들 수 있는지 안내해주십시오.

답변

7

OpenCV에서 제공하는 가우스 필터가 공간 (시간) 도메인에서 생성되었지만 주파수 도메인에서 필터를 원한다는 점을 고집합니다. Here은 주파수 영역에서 고역 필터링과 저역 통과 필터링의 차이점에 대한 훌륭한 기사입니다.

주파수 도메인 필터링이 어떻게 작동하는지 잘 이해하면 주파수 도메인에서 가우스 필터를 만들려고 할 준비가되었습니다. Here은 주파수 영역에서 몇 가지 다른 (가우시안 포함) 필터를 만드는 좋은 강의입니다.

아직 문제가 해결되지 않으면 조금 후에 예제로 내 게시물을 업데이트하려고합니다!

는 편집 :이 확실히 최적화되지

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 

#include <iostream> 

using namespace cv; 
using namespace std; 

double pixelDistance(double u, double v) 
{ 
    return cv::sqrt(u*u + v*v); 
} 

double gaussianCoeff(double u, double v, double d0) 
{ 
    double d = pixelDistance(u, v); 
    return 1.0 - cv::exp((-d*d)/(2*d0*d0)); 
} 

cv::Mat createGaussianHighPassFilter(cv::Size size, double cutoffInPixels) 
{ 
    Mat ghpf(size, CV_64F); 

    cv::Point center(size.width/2, size.height/2); 

    for(int u = 0; u < ghpf.rows; u++) 
    { 
     for(int v = 0; v < ghpf.cols; v++) 
     { 
      ghpf.at<double>(u, v) = gaussianCoeff(u - center.y, v - center.x, cutoffInPixels); 
     } 
    } 

    return ghpf; 
} 


int main(int /*argc*/, char** /*argv*/) 
{ 
    Mat ghpf = createGaussianHighPassFilter(Size(128, 128), 16.0); 

    imshow("ghpf", ghpf); 
    waitKey(); 

    return 0; 
} 

: 여기 내가 가우스 하이 패스 필터를 구현에 쓴 짧은 예이다 (강의를 기반으로 내가 당신에게 지적)

enter image description here

01 : 필터 수단을 통해 발전기,하지만 난 그것을 어쨌든 :) 이해를 쉽게하기 위해 단순하고 정직을 유지하려고,이 코드는 다음과 같은 필터를 표시

참고 :이 필터는 FFT로 이동하지 않습니다. 즉, DC는 왼쪽 위 모서리 대신 중앙에 놓여질 때 작동합니다. OpenCV에서 FFT 시프 팅을 수행하는 방법은 OpenCV dft.cpp 샘플 (특히 62 - 74 행)을 참조하십시오.

즐기십시오!

+0

답변 주셔서 감사합니다 나는 당신의 훌륭한 지침에 의한 결과에 매우 가깝다고 생각하지만 matlab에서 생산되는이 필터를 어떻게 생산할 수 있을지 확신하지 못합니다 ... [편집] http :// /uploading.com/files/498a6e9b/filter.png/ – wolvorinePk

+0

이것은 하나의 MATLAB에서 출력입니다 ... 내가이 유형의 필터에 대한 4 개의 비행기를 만들고 그들 모두를 병합해야한다는 뜻입니까? http://i44.tinypic.com/r0twf7.png – wolvorinePk

+0

사실, Matlab에서 필터가 'fftshift'를 사용하여 이동 한 것은 무엇입니까? 필자가 언급 한 첫 번째 기사에서 설명한 것처럼 쿼드런트 1 <-> 4 및 2 <-> 3을 바꿉니다. 또한,'dft.cpp' OpenCV 샘플은이를 수행하는 방법을 보여줍니다. – mevatron

관련 문제