离散二维傅里叶变换
常用性质:
可分离性、周期性和共轭对称性、平移性、旋转性质、卷积与相关定理;
卷积与相关定理
卷积定理包括空间域卷积和频率域卷积,卷积是空间域滤波和频率域滤波之间的纽带:两个空域信号的卷积等价于其频域信号的乘积
f
(
x
,
y
)
∗
h
(
x
,
y
)
→
F
(
u
,
v
)
H
(
u
,
v
)
f(x,y)*h(x,y) → F(u,v)H(u,v)
f(x,y)∗h(x,y)→F(u,v)H(u,v)
该性质的好处是将需要经过翻折、平移、相乘、求和等步骤实现的复杂的卷积运算简化为简单的乘法运算,这也是快速傅里叶变换(FFT)的出现使得该性质得到更广泛应用,同时,该性质对于理解信号的频率域处理方法特别重要,使得信号的空间域处理可以转换到频率域进行处理实现。
实现代码
SmoothbyDFT
void SmoothByDFT(Mat &srcF, Size size, Mat &dst) {
Mat smoothF = Mat::ones(size, CV_8UC1);
Mat smooth, src;
smoothF.convertTo(smooth, CV_32FC1, 1.0 / size.area());//将图像和平滑模板转为单通道64位浮点类型
srcF.convertTo(src, CV_32FC1, 1.0 / 255);
dst.create(abs(src.rows - smooth.rows) + 1, abs(src.cols - smooth.cols) + 1, src.type());//创建图像与指定模板卷积后的大小Mat
Size dftSize;
dftSize.width = getOptimalDFTSize(src.cols + smooth.cols - 1);//获得dft最好的图像大小,(2^3^5^)可能是为了优化执行fft
dftSize.height = getOptimalDFTSize(src.rows + smooth.rows - 1);
Mat tempsrc(dftSize, src.type(), Scalar::all(0));//0填充
Mat tempsmooth(dftSize, smooth.type(), Scalar::all(0));
Mat roisrc(tempsrc, Rect(0, 0, src.cols, src.rows));//将原图像拷贝到放到尺寸后的图像
src.copyTo(roisrc);
Mat roismooth(tempsmooth, Rect(0, 0, smooth.cols, smooth.rows));
smooth.copyTo(roismooth);
dft(tempsrc, tempsrc, 0, src.rows);//对模板和图像执行dft
dft(tempsmooth, tempsmooth, 0, smooth.rows);
mulSpectrums(tempsrc, tempsmooth, tempsrc, 0, false);//执行卷积
dft(tempsrc, tempsrc, DFT_INVERSE + DFT_SCALE, dst.rows);//反变换
tempsrc(Rect(0, 0, dst.cols, dst.rows)).copyTo(dst);//截出需要的图像区域大小
normalize(dst, dst, 0, 1, NORM_MINMAX);//归一化操作
imshow("原图", srcF);
imshow("DFT滤波后", dst);
}