int main(int argc, char* argv[])
{
Mat image1 = imread("1.jpg",0);//灰度tu!
int m = getOptimalDFTSize(image1.cols);//得到合适的傅里叶变换时图像取的行列数
int n = getOptimalDFTSize(image1.rows);
Mat padded;//使图像符合合适的傅里叶变换时图像取的行列数
copyMakeBorder(image1, padded, 0, n - image1.rows, 0, m - image1.cols, BORDER_CONSTANT);
Mat plane[] = { Mat_<float>(padded), Mat::zeros(padded.size(),CV_32F) };//为频谱和幅度铺准备空间
Mat complex;
merge(plane, 2, complex);//合成为一张图
dft(complex,complex);
split(complex, plane);
magnitude(plane[0], plane[1], plane[0]);//取出幅度谱的图像
plane[0] += 1;
log(plane[0], plane[0]);//变为对数尺度,便于观察
//以下为图像中心化,使幅度最大的点在图像中心
int cx = plane[0].cols / 2;
int cy = plane[0].rows / 2;
Mat q0(plane[0], Rect(0, 0, cx, cy));
Mat q1(plane[0], Rect(cx, 0, cx, cy));
Mat q2(plane[0], Rect(0, cy, cx, cy));
Mat q3(plane[0], Rect(cx, cy, cx, cy));
Mat temp;
q0.copyTo(temp);
q3.copyTo(q0);
temp.copyTo(q3);
q1.copyTo(temp);
q2.copyTo(q1);
temp.copyTo(q2);
//归一化
normalize(plane[0], plane[0], 0, 1, CV_MINMAX);
cvNamedWindow("INPUT");
imshow("原图", image1);
cvNamedWindow("OUTPUT");
imshow("傅里叶变换后的图", plane[0]);
waitKey(0);
return 0;
}
基于opencv图片的傅里叶变换
最新推荐文章于 2024-05-04 14:55:50 发布