2012-03-06 92 views
2

要確定正確的填充大小(例如,如果圖像的寬度和高度是10X10,那麼應該是20X20)之後創建的高斯高通濾波器。我如何高斯濾波器應用到DFT輸出中的OpenCV

我有我試圖在OpenCV的端口Matlab代碼,但我正常有困難將它移植。我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,我能夠產生自己的形象,但我不知道如何創建高斯濾波器。請指導我如何創建如上所示的高通高斯濾波器?

回答

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

注意:此濾波器不是FFT偏移(即當DC置於中心而不是左上角時,此濾波器工作)。請參閱OpenCV dft.cpp示例(特別是第62-74行)瞭解如何在OpenCV中執行FFT移位。

享受!

+0

感謝您的答案我在想我是非常接近你的出色指導的結果,但我不知道如何生產這樣的濾波器是在matlab中生成的... [編輯] http:/ /uploading.com/files/498a6e9b/filter.png/ – wolvorinePk 2012-03-07 13:25:35

+0

這一個是matlab的輸出...這是否意味着我需要爲這種類型的過濾器創建4個不同的平面併合並所有這些? http://i44.tinypic.com/r0twf7.png – wolvorinePk 2012-03-07 13:38:11

+0

實際上,發生的情況是在Matlab中使用'fftshift'移動了過濾器。正如我在第一篇文章中提到的那樣,交換象限1 <-> 4和2 <-> 3.另外,我相信'dft.cpp' OpenCV示例演示瞭如何執行此操作。 – mevatron 2012-03-07 13:50:29