2

正しいパディング サイズを決定した後、ガウス ハイパス フィルターを作成したいと考えています (たとえば、画像の幅と高さが 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 を使用する方法を知っており、そのイメージを生成できますが、ガウス フィルターを作成する方法がわかりません。上記のようなハイパス ガウス フィルターを作成する方法を教えてください。

4

1 に答える 1

9

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

これは決して最適化されたフィルタージェネレーターではありませんが、理解しやすいようにシンプルでわかりやすいものにしようとしました:)とにかく、このコードは次のフィルターを表示します。

ここに画像の説明を入力してください

注:このフィルターはFFTシフトされません(つまり、このフィルターは、DCが左上隅ではなく中央に配置されている場合に機能します)。OpenCVでFFTシフトを実行する方法については、OpenCV dft.cppサンプル(特に62〜74行目)を参照してください。

楽しみ!

于 2012-03-06T18:19:07.327 に答える