我想在确定正确的填充尺寸后创建高斯高通滤波器(例如,如果图像宽度和高度是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 …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现FFT,我可以使用代码等,但事情的一般顺序令我感到困惑.
我是否正确地认为这是正确的事情顺序?
输入 - >重叠输入 - >窗口 - > FFT - >相位计算/重叠补偿 - >输出
我得到的结果接近我的输入频率,但它们总是被一些我无法解决的因素关闭,即440Hz总是407Hz,430Hz总是420Hz.
令我困惑的主要部分是初始重叠,因为我一直在研究一些开源FFT代码,这是我永远无法解决的部分.我似乎从看到那些重叠应该在窗口之前发生的想法得到了这个想法,但对我来说逻辑上,不会那么混乱的窗口?
任何建议都会很棒
谢谢
我的主要目标是证明卷积定理有效(只是提醒一下:卷积定理意味着idft(dft(im) .* dft(mask)) = conv(im, mask)).我正在尝试编程.
这是我的代码:
function displayTransform( im )
% This routine displays the Fourier spectrum of an image.
%
% Input: im - a grayscale image (values in [0,255])
%
% Method: Computes the Fourier transform of im and displays its spectrum,
% (if F(u,v) = a+ib, displays sqrt(a^2+b^2)).
% Uses display techniques for visualization: log, and stretch values to full range,
% cyclic shift DC to center (use fftshift).
% Use showImage to display …Run Code Online (Sandbox Code Playgroud) 我使用fftw/C++和在线计算器计算了数组{1,2,3,4,5,6}的FFT(http://calculator-fx.com/calculator/fast-fourier-transform-calculator-fft/ 1d离散傅立叶变换).结果似乎有点不同.
fftw输出:
Run Code Online (Sandbox Code Playgroud)0 21.000000 0.000000 1 -3.000000 5.196152 2 -3.000000 1.732051 3 -3.000000 0.000000 4 0.000000 0.000000 5 0.000000 0.000000
在线计算器输出:
Run Code Online (Sandbox Code Playgroud)21 + 0j -3 + 5.196152j -3 + 1.732051j -3 + 0j -3 - 1.732051j -3 - 5.196152j
如上所示,fftw的后两个结果变为零.无法弄清楚为什么.有人可以帮帮我吗?谢谢.
[编辑] cpp代码:
int main()
{
fftw_complex *out;
fftw_plan plan;
double arr[]={1,2,3,4,5,6};
int n = sizeof(arr)/sizeof(double);
out = (fftw_complex*)fftw_malloc ( sizeof ( fftw_complex ) * n );
plan = fftw_plan_dft_r2c_1d ( n, arr, out, FFTW_ESTIMATE );
fftw_execute ( …Run Code Online (Sandbox Code Playgroud) 我试图在Matlab中使用1D DFT的组合来实现2D DFT.将我的结果与Matlab的内置函数(fft2)进行比较时,我意识到我有以下问题:
此图显示了两个结果之间的比较.侧面的红色数字表示重新排序问题.

我的代码如下:
x = imread('img.png');
x = double(x);
x = x(1:12,1:5)
% FFT
Xw = complex(zeros(size(x)));
for row = 1:size(x,1)
Xw(row,:) = fft(x(row,:));
end
for col = 1:size(x,2)
Xw(:,col) = fft(Xw(:,col)');
end
Run Code Online (Sandbox Code Playgroud)
有人可以指出我的问题在哪里吗?谢谢
我坚持这个问题2天了.有人可以帮我逻辑吗?
我正在研究C++程序以获得良好的算法.我现在正在研究Danielson-Lanczos算法来计算序列的FFT.
看着
mmax=2;
while (n>mmax) {
istep = mmax<<1;
theta = -(2*M_PI/mmax);
wtemp = sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi = sin(theta);
wr = 1.0;
wi = 0.0;
for (m=1; m < mmax; m += 2) {
for (i=m; i <= n; i += istep) {
j=i+mmax;
tempr = wr*data[j-1] - wi*data[j];
tempi = wr * data[j] + wi*data[j-1];
data[j-1] = data[i-1] - tempr;
data[j] = data[i] - tempi;
data[i-1] += tempr;
data[i] += tempi;
}
wtemp=wr;
wr += wr*wpr …Run Code Online (Sandbox Code Playgroud) .*
不支持使用复数整数运算时出错 .
Error in DFT (line 35)
J(u,v) = J(u,v) + I(x,y) .*exp(-1i*2*pi.*((u*(x-1)/M)+(v*(y-1)/N)));
Run Code Online (Sandbox Code Playgroud)