#include <iostream>
#include <opencv2/opencv.hpp>
#define WITH 600
#define window1 "【原图】"
#define window2 "【效果图1】"
#define window3 "【效果图2】"
using namespace cv;
using namespace std;
//对图像进行频域变换。(傅里叶变换)
int main()
{
//1.原图像。
Mat src = imread("女战士.jpg",0);
resize(src,src,Size(),0.4,0.4);
imshow(window1,src);
//2.扩充原图。getoptimalsize
int x = getOptimalDFTSize(src.cols);
int y = getOptimalDFTSize(src.rows);
Mat g_src(y,x,CV_32FC2,Scalar(Scalar::all(0)));
//3.填充扩充元素。copymakeborder
vector<Mat>temp;
split(g_src,temp);
Mat roi = temp[0](Rect(0, 0, src.cols, src.rows));
Mat_<float>(src).copyTo(roi);
merge(temp,g_src);
//4.离散傅里叶变换,注意图像应为32F双通道。
dft(g_src,g_src,g_src.rows);
//5.将复数转换为幅值。magnitude
split(g_src,temp);
magnitude(temp[0],temp[1],temp[0]);
Mat mage = temp[0];
//6.将幅值用对数来缩小。log
mage += Scalar(Scalar::all(1));
log(mage,mage);
//7.归一化。
normalize(mage,mage,0,1,NORM_MINMAX);
//8.显示频谱图像。、、效果不好的话,可以将源点转换到中间。
imshow(window2,mage);
//9 将源点转换到中间。左上与右下,左下与右上交换。
int cx = mage.cols/2;
int cy = mage.rows/2;
Mat lt = mage(Rect(0,0,cx,cy));
Mat lb= mage(Rect(0,cy,cx,cy));
Mat rt = mage(Rect(cx,0,cx,cy));
Mat rb = mage(Rect(cx,cy,cx,cy));
Mat t;
lt.copyTo(t);
rb.copyTo(lt);
t.copyTo(rb);
lb.copyTo(t);
rt.copyTo(lb);
t.copyTo(rt);
imshow(window3,mage);
waitKey(0);
return 0;
}
对图像进行频域变换(傅里叶变换)
最新推荐文章于 2023-11-05 22:45:02 发布