【问题标题】:How to apply Gaussian filter to DFT output in OpenCV如何将高斯滤波器应用于 OpenCV 中的 DFT 输出
【发布时间】:2014-07-02 23:50:49
【问题描述】:

我想在确定正确的填充大小后创建一个高斯高通滤波器(例如,如果图像宽度和高度是 10X10,那么应该是 20X20)。

我有尝试在 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,并且能够生成它的图像,但我不确定如何创建高斯滤波器。请指导我如何创建如上所示的高通高斯滤波器?

【问题讨论】:

    标签: image opencv fft gaussian dft


    【解决方案1】:

    我相信您遇到的问题是 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;
    }
    

    这绝对不是一个优化的过滤器生成器,但我尽量让它简单明了以便于理解:) 不管怎样,这段代码显示了以下过滤器:

    注意:此过滤器不是 FFT 移位的(即,当 DC 放置在中心而不是左上角时,此过滤器起作用)。请参阅 OpenCV dft.cpp 示例(特别是第 62 - 74 行),了解如何在 OpenCV 中执行 FFT 移位。

    享受吧!

    【讨论】:

    • 感谢您的回答,我认为您的出色指导让我非常接近结果,但我不确定如何制作像 matlab 中产生的这个过滤器...@987654324 @uploading.com/files/498a6e9b/filter.png
    • 这是 matlab 的输出……这是否意味着我需要为这种类型的过滤器创建 4 个不同的平面并合并所有平面? i44.tinypic.com/r0twf7.png
    • 实际上,那里发生的情况是在 Matlab 中使用 fftshift 移动了过滤器。正如我在第一篇文章中提到的那样,交换象限 1 4 和 2 3。另外,我相信 dft.cpp OpenCV 示例显示了如何做到这一点。
    • mevatron 非常感谢,你拯救了我的一天,通过使用四边形,我可以根据 matlab 显示的过滤器重新排列它们。
    • 没问题!很高兴我能帮忙! :)
    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多