- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的目标是在 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/30571641/
所以,我有一个 Triangle->AABB 碰撞算法,我让它返回 AABB 碰撞的三角形。我希望三角形的 3 个 vector 和运动的方向/幅度能让我确定一个偏转 vector ,这样当你以一个角
我希望我能找到一种方法从 python 中的 mp3 中获取振幅数据。与 audacity 类似,但我不想要视觉效果,一个简单的值数组就可以了。当声音变大时,我希望我的代码在某些时候对声音使用reac
在 OpenCV 中,如何计算 Mat 中的平均梯度强度和平均梯度方向? 我已经通过谷歌搜索找到了以下方法,但我想在继续下一步之前确认我确实在正确地执行此操作。 这是正确的吗? Mat img = i
我想在 java 中为麦克风创建一个音频电平表来检查输入的音量。它应该看起来像操作系统之一。我不是在问 gui。它只是计算 产生的字节流中的音频电平 n = targetDataLine.read(
我正在开发一个应用程序,该应用程序既可以录制音频文件,也可以选择在录制完成后播放该文件。 UI 有一个 EQ 组件,该组件相对于当前录音幅度进行动画处理。我已经通过 MediaRecorder.get
我读过两篇关于从 AudioInputStream 中提取样本并将其转换为 dB 的文章。 https://stackoverflow.com/a/26576548/8428414 https://s
我的目标是在 OpenCV 中获取图像的DFT。 使用 dft 函数,我能够计算它,然后通过计算它的大小来绘制它(然后,应用对数并最终对其进行归一化,以便绘制介于 0 和 1 之间的值) . 我的结果
我的目标是在 OpenCV 中获取图像的DFT。 使用 dft 函数,我能够计算它,然后通过计算它的大小来绘制它(然后,应用对数并最终对其进行归一化,以便绘制介于 0 和 1 之间的值) . 我的结果
我正在从事一个 Python 项目,该项目模拟振动弦产生的声音。如果对于给定的字符串,我已经确定了运动的傅里叶变换,则可以通过简单的操作将这些结果更改为显示每个(音频)频率幅度的数据。 是否可以使用
我使用 apache commons 数学库来转换我的音频样本缓冲区上的 FFt 和 IFFT。 FFT 的输出给了我一组复数。频率在中间镜像。样本缓冲区大小为 4096 个样本,我得到 2048 个
我是一名优秀的程序员,十分优秀!