3、cImage);//将输入图像延扩到最佳的尺寸,边界用0补充intm=getOptimalDFTSize(srcImage.rows);intn=getOptimalDFTSize(srcImage.cols);//将添加的像素初始化为0.Matpadded;copyMakeBorder(srcImage,padded,0,m-srcImage.rows,0,n-srcImage.cols,BORDER_CONSTANT,Scalar::all(0));//为傅立叶变换的结果(实部和虚部)分配存储空间。//将planes数组组合合并成一个多通道的数组com
4、plexIMatplanes[]={Mat_(padded),Mat::zeros(padded.size(),CV_32F)};MatcomplexI;merge(planes,2,complexI);//进行就地离散傅里叶变换dft(complexI,complexI);//将复数转换为幅值,即=>log(1+sqrt(Re(DFT(I))^2+Im(DFT(I))^2))split(complexI,planes);//将多通道数组complexI分离成几个单通道数组,planes[0]=Re(DFT(I),planes[1]=Im(D
5、FT(I))magnitude(planes[0],planes[1],planes[0]);//planes[0]=magnitudeMatmagnitudeImage=planes[0];//进行对数尺度(logarithmicscale)缩放magnitudeImage+=Scalar::all(1);log(magnitudeImage,magnitudeImage);//求自然对数//剪切和重分布幅度图象限//若有奇数行或奇数列,进行频谱裁剪magnitudeImage=magnitudeImage(Rect(0,0,magnitudeImage
6、.cols&-2,magnitudeImage.rows&-2));//重新排列傅立叶图像中的象限,使得原点位于图像中心intcx=magnitudeImage.cols/2;intcy=magnitudeImage.rows/2;Matq0(magnitudeImage,Rect(0,0,cx,cy));//ROI区域的左上Matq1(magnitudeImage,Rect(cx,0,cx,cy));//ROI区域的右上Matq2(magnitudeImage,Rect(0,cy,cx,cy));//ROI区域的左下Matq3(magnitudeImag
7、e,Rect(cx,cy,cx,cy));//ROI区域的右下//交换象限(左上与右下进行交换)Mattmp;q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);//交换象限(右上与左下进行交换)q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);//归一化,用0到1之间的浮点值将矩阵变换为可视的图像格式normalize(magnitudeImage,magnitudeImage,0,1,CV_MINMAX);//显示效果图imshow("频域",magnitudeImage);//
8、(3)频域-->空域Matinversed;dft(complex