- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的目标是在 OpenCV 中获取图像的DFT
。
使用 dft
函数,我能够计算它,然后通过计算它的大小来绘制它(然后,应用对数并最终对其进行归一化,以便绘制介于 0 和 1 之间的值) .
我的结果是,对于下图,我向您展示的结果(为了在图像中心具有较低的频率而进行交换):
但是,如果我将其与使用其他工具(如 Halcon)获得的结果进行比较,这对我来说似乎是不正确的,因为它似乎具有非常“高”的值(我的意思是 OpenCV DFT 幅度):
我认为可能是这些原因:
第一个 有一个问题,我很难分析,而且 OpenCV 没有 FFT 函数,而且 Halcon 没有 DFT 函数(如果我'我当然没有错),所以我不能直接比较它。
第二个是我工作时间最长的一个,但我仍然没有找到原因。
这是我用来绘制 img
(这是我的 DFT 图像)大小的代码:
// 1.- To split the image in Re | Im values
Mat planes[] = {Mat_<float>(img), Mat::zeros(img.size(), CV_32F)};
// 2.- To magnitude + phase
split(img, planes);
// Calculate magnitude. I overwrite it, I know, but this is inside a function so it will be never used again, doesn't matter
magnitude(planes[0], planes[1], planes[0]);
// Magnitude Mat
Mat magI = planes[0];
// 3.- We add 1 to all them in order to perform the log
magI += Scalar::all(1); // switch to logarithmic scale
log(magI, magI);
// 4.- Swap the quadrants to center frequency
magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2));
int cx = magI.cols/2;
int cy = magI.rows/2;
Mat q0(magI, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant
Mat q1(magI, Rect(cx, 0, cx, cy)); // Top-Right
Mat q2(magI, Rect(0, cy, cx, cy)); // Bottom-Left
Mat q3(magI, Rect(cx, cy, cx, cy)); // Bottom-Right
// swap quadrants (Top-Left with Bottom-Right)
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
// swap quadrant (Top-Right with Bottom-Left)
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
// 5.- Normalize
// Transform the matrix with float values into a
// viewable image form (float between values 0 and 1).
normalize(magI, magI, 0, 1, CV_MINMAX);
// Paint it
imshow( "Magnitud DFT", magI);
总结一下:关于为什么我在这两个幅度之间有这种差异有什么想法吗?
最佳答案
我会将我的评论总结成一个答案。
当人们考虑进行傅立叶变换以在逆域中工作时,假设是进行逆变换将返回相同的函数/向量/任何东西。换句话说,我们假设
许多程序和库(例如 Mathematica、Matlab/octave、Eigen/unsupported/FFT 等)都是这种情况。然而,对于许多库( FFTW 、 KissFFT 等),情况并非如此,并且往往存在一定的规模
其中 s
通常是数组中元素的数量 (m
) 的某次幂(如果没有以不匹配的方式缩放,则应为 1变换和逆)。这样做是为了避免迭代所有 m
元素乘以一个比例,通常是 not important .
也就是说,在查看逆域中的尺度时, 缩放变换的各种库可以自由地对变换和逆变换使用不同的尺度。变换/逆的常见缩放对包括 {m^-1
、m
} 和 {m^-0.5
、m^ 0.5
}。因此,当比较来自不同库的结果时,我们应该准备好 m
的因素(按 m^-1
缩放与未缩放),m^0.5
(按 m^-0.5
缩放 vs. 未按 m^-1
缩放和缩放 vs. 按 m^-0.5
缩放>) 或什至其他比例,如果使用其他比例因子的话。
注意:此比例因子不与规范化数组相关,因此所有值都是[0,1]
或者数组的范数等于1。
关于opencv - DFT 和 FFT(幅度)结果之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31074932/
假设一个数字序列(波状数据)。然后我执行 DFT(或 FFT)变换。我想要实现的下一步是找到与数据中包含的实际频率相对应的频率。正如我们所知,DFT 输出具有实部和虚部 a[i] 和 b[i]。如果我
我正在尝试在频域中执行逆滤波和伪逆滤波。 但是我在访问 DFT 系数和之后乘以 DFT 矩阵时遇到问题,因为我得到了复数,因此实际上是两个矩阵...... 基本上逆向过滤执行 F = G/H, 其中
对于我的项目,我必须对大型 2D 输入矩阵进行 DFT,对其进行处理,然后使用 IDFT 将其转换回来,并将结果与输入矩阵进行比较。我的问题出在 2D DFT 步骤中。我使用一个小的简单数据集编写
我有一个场景,我必须从未知的 excel 文件和未知的选项卡中获取数据。所以我创建了一个包含 50 列的表。 问题是进入第二个循环后 ssis 包没有进展。第一个循环获取文件名,第二个循环获取该文件中
我正在尝试用 Java 编写一个小型离散傅立叶变换,以查找清晰的 400 Hz 正弦信号中的幅度谱(1 秒为 pcm 带符号短) 首先我计算复数值的 DFT: public void berechne
我们需要在 GSL 中更改/重新实现标准的 DFT 实现,即 int FUNCTION(gsl_dft_complex,transform) (const BASE data[],
注意:这个问题最初是在 OpenCV forum 上提出的几天前。 我正在构建一个广泛使用二维 dft、离散傅立叶变换的图像处理程序。我正在尝试加速以实时运行。 在该应用程序中,我仅使用由矩形 ROI
我正在编写一个非常简单的就地 DFT。我正在使用此处显示的公式: http://en.wikipedia.org/wiki/Discrete_Fourier_transform#Definition与
我试图通过 Matlab 中的 DFT(数字傅里叶变换)使用相关性来比较 2 个信号的相似程度,但相关函数给出的结果并不是真正可预测的。例如,如果我比较那两对信号: 相关性 1 和 2 相关性 3 和
更多细节:我开始写我的“学士学位论文”这将是与图像压缩相关的东西 我想知道您是否知道有任何尝试使用 PNG 格式的方波傅里叶级数(变换)作为滤波器而不是 haar 小波?会有什么好处吗? 如果您对我的
在这个 DFT 上我一直在用头撞墙。它应该打印出:8,0,0,0,0,0,0,0 但我得到的是 8,然后是非常非常小的数字。这些是舍入误差吗?有什么我可以做的吗?我的 Radix2 FFT 给出了正确
我想要质心的坐标并且我已经计算了 DFT(用于不同的目的)。我看过一些幻灯片,暗示可以通过查看矩阵的第一个值来粗略估计质心。代码基于:http://docs.opencv.org/doc/tutori
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
我正在尝试对两个单独的图像进行逐点乘法傅立叶变换,然后再转换回普通图像。我不太熟悉在 OpenCV 中使用傅立叶变换,但这就是我目前所拥有的。显示输出的最后一行导致类型为“System.Runtime
我正在尝试在我的 C++ 代码中使用 FFTW3,并且我想使用 scipy.fftpack.fft 在 python 中完成同样的事情 用于真正的一维信号。我只是制作一维信号并从信号中找到频率。我不知
我正在进行一项作业,以 20kHz 的采样频率对频率为 500Hz 的方波执行 200 点 DFT,其幅度在 0 和 20 之间交替。 我正在使用 C++,我已经想出了如何编写 DFT 方程的代码,我
我最近在我的 Ubuntu 16.04 机器上重新编译了 OpenCV 3.2.0 以包含 CUDA。出于某种原因,cv::dft() 现在对特定图像大约需要 30 秒,而不是编译前的 5 秒。这是灾
我正在研究图像频率过滤的 GPU 实现。我的代码在 CPU 上运行良好(我使用了类似 this 的东西),但我花了一整天时间尝试在 GPU 上进行同样的工作——但没有成功。我想在频域中应用一个滤波器,
我创建了一个简单的积分函数和 DFT 函数,可以将它们与我编写的其他代码一起使用。 from math import sin,pi from time import time def aintegra
我使用以下代码计算图像与指定内核(在我的例子中是高斯内核)的卷积。每次我得到不同的结果,结果图像甚至不接近我在空间域中通过卷积获得的图像。首先我认为问题出在图像的数据类型上。我将它们更改为 32 和
我是一名优秀的程序员,十分优秀!