Как применить фильтр Гаусса к выводу DFT в OpenCV

Я хочу создать фильтр верхних частот Гаусса после определения правильного размера заполнения (например, если ширина и высота изображения 10X10, то должно быть 20X20).

У меня есть код Matlab, который я пытаюсь перенести в 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, и я могу создать его изображение, но я не уверен, как создать фильтр Гаусса. Подскажите, пожалуйста, как мне создать высокочастотный фильтр Гаусса, как показано выше?


person wolvorinePk    schedule 06.03.2012    source источник


Ответы (1)


Я полагаю, что вы застряли в том, что фильтр Гаусса, предоставляемый OpenCV, создается в пространственной (временной) области, но вам нужен фильтр в частотной области. Вот хорошая статья о разнице между фильтрацией верхних и нижних частот в частотной области.

Как только вы хорошо поймете, как работает фильтрация в частотной области, вы готовы попытаться создать фильтр Гаусса в частотной области. Вот хорошая лекция о создании нескольких различных (в том числе гауссовых) фильтров в частотной области.

Если у вас все еще возникают трудности, я постараюсь немного позже обновить свой пост с примером!

РЕДАКТИРОВАТЬ: Вот краткий пример, который я написал о реализации фильтра верхних частот Гаусса (на основе лекции, на которую я указал вам):

#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;
}

Это определенно не оптимизированный генератор фильтров, но я старался сделать его простым и понятным, чтобы облегчить понимание :) В любом случае, этот код отображает следующий фильтр:

введите здесь описание изображения

ПРИМЕЧАНИЕ. Этот фильтр не сдвинут БПФ (т. е. этот фильтр работает, когда DC помещается в центр, а не в левый верхний угол). См. пример OpenCV dft.cpp. (в частности, строки 62–74) о том, как выполнять сдвиг БПФ в OpenCV.

Наслаждаться!

person mevatron    schedule 06.03.2012
comment
Спасибо за ответ, я думаю, что я очень близок к результату благодаря вашему превосходному руководству, но я не уверен, как я могу создать фильтр, подобный этому, который создается в Matlab... Изменить uploading.com/files/ 498a6e9b/filter.png - person wolvorinePk; 07.03.2012
comment
это вывод из Matlab ... значит ли это, что мне нужно создать 4 разных плоскости для этого типа фильтра и объединить их все? i44.tinypic.com/r0twf7.png - person wolvorinePk; 07.03.2012
comment
На самом деле происходит то, что фильтр был сдвинут с помощью fftshift в Matlab. Как описано в первой статье, о которой я упоминал, меняет местами квадранты 1 ‹-> 4 и 2 ‹-> 3. Кроме того, я считаю, что пример dft.cpp OpenCV показывает, как это сделать. - person mevatron; 07.03.2012
comment
mevatron Большое спасибо, вы спасли мой день, и с помощью квадроциклов я могу переставить их в соответствии с отображаемым фильтром Matlab. - person wolvorinePk; 10.03.2012
comment
Без проблем! Рад, что смог помочь! :) - person mevatron; 10.03.2012
comment
Есть еще вопрос, если у вас есть время, пожалуйста, поделитесь советами там... большое спасибо! stackoverflow .com/questions/9646652/ - person wolvorinePk; 11.03.2012
comment
Я пытался отфильтровать свое изображение с помощью указанного вами фильтра, но вместо этого я получаю то же самое, что и blur (даже когда я применяю его к матрице ДПФ, используя filter2D). Вы знаете, что я делаю неправильно? - person Btc Sources; 20.05.2015