我正在使用opencv来计算图像的butterworth滤镜。问题中的图像是物理参数,即在每个节点处的某些单位的压力。它不仅仅是灰度或颜色值。
我已按照此处的示例进行操作:http://docs.opencv.org/2.4/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html http://breckon.eu/toby/teaching/dip/opencv/lecture_demos/c++/butterworth_lowpass.cpp
我已成功实施此过滤器。 I.E.我可以DFT,创建滤波器内核,应用它,然后反傅里叶变换。
然而,idft之后的值的大小完全关闭。
特别是,我复制了可以在上述链接中找到的代码行:
// Perform Inverse Fourier Transform
idft(complexImg, complexImg);
split(complexImg, planes);
imgOutput = planes[0].clone();
在上面的代码段中, 1.)我计算complexImg的idft并将其保存到complexImg。 2.)我将complexImg分成实部和虚部(分别保存在plane [0]和plane [1]中) 3.)我将实际部分保存到imgOutput,因为我的原始图像是真实的。
然而,如果原始图像,即imgInput具有O(10 ^ -1)的平均值,则imgOutput具有O(10 ^ 4到10 ^ 5)的平均值。似乎需要某种类型的规范化?在上面的示例链接中,为了查看目的,值在0和1之间归一化,但这不是我需要的。
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:0)
问题通过2 * N归一化来解决,其中N是图像中的像素数。
即
imgOutput = imgOutput/imgOutput.cols/imgOutput.rows/2;
答案 1 :(得分:0)
根据文档:https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#idft
注意
默认情况下,dft和idft都不缩放结果。因此,您应该将DFT_SCALE明确传递给dft或idft之一,以使这些转换相互相反。
因此,有些小问题将解决此问题: icvdft = cv.idft(dft_array,flags = cv.DFT_SCALE)