l 为什么要在频率域研究图像增强
ü 可以利用频率成分和图像外表之间的对应关系。一 些在空间域表述困难的增强任务,在频率域中变得非 常普通
ü 滤波在频率域更为直观,它可以解释空间域滤波的 某些性质
ü 可以在频率域指定滤波器,做反变换,然后在空间 域使用结果滤波器作为空间域滤波器的指导
ü一旦通过频率域试验选择了空间滤波,通常实施都在空间域进行
理解傅里叶变换请看图解傅里叶变换(时域频域)_频域 傅里叶 时序图怎么画-CSDN博客,图文并茂讲解。
下面是opencv自带例程;
OpenCV源码库文件 samples/cpp/tutorial_code/core/discrete_fourier_transform/discrete_fourier_transform.cpp。
以下为函数 dft() 使用范例:
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
int main(int argc, char ** argv)
{
const char* filename = argc >=2 ? argv[1] : "lena.jpg";
Mat I = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
if( I.empty())
return -1;
Mat padded; //expand input image to optimal size
int m = getOptimalDFTSize( I.rows );
int n = getOptimalDFTSize( I.cols ); // on the border add zero values
copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
Mat complexI;
merge(planes, 2, complexI); // Add to the expanded another plane with zeros
dft(complexI, complexI); // this way the result may fit in the source matrix
// compute the magnitude and switch to logarithmic scale
// => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude
Mat magI = planes[0];
magI += Scalar::all(1); // switch to logarithmic scale
log(magI, magI);