傅里叶变换【1】:傅里叶变换及逆变换

//快速傅里叶变换
void fft2Image(InputArray _src, OutputArray _dst)
{
	//得到Mat类型
	Mat src = _src.getMat();
	//判断位深
	CV_Assert(src.type() == CV_32FC1 || src.type() == CV_64FC1);
	CV_Assert(src.channels() == 1 || src.channels() == 2);
	int rows = src.rows;
	int cols = src.cols;
	//为了进行快速的傅里叶变换,我们经行和列的扩充,找到最合适扩充值
	Mat padded;
	int rPadded = getOptimalDFTSize(rows);
	int cPadded = getOptimalDFTSize(cols);
	//进行边缘扩充,扩充值为零
	copyMakeBorder(src, padded, 0, rPadded - rows, 0, cPadded - cols, BORDER_CONSTANT, Scalar::all(0));
	//快速的傅里叶变换(双通道:用于存储实部 和 虚部)
	dft(padded, _dst, DFT_COMPLEX_OUTPUT);
}
int main()
{
	//输入图像矩阵
	Mat img = imread("lena.jpg", 0);
	if (!img.data)
		return -1;
	//数据类型转换:转换为浮点型
	Mat fImg;
	img.convertTo(fImg, CV_64FC1);
	//快速傅里叶变换
	Mat fft2;
	fft2Image(fImg, fft2);
	//傅里叶逆变换
	Mat image;
	cv::dft(fft2, image, DFT_INVERSE + DFT_REAL_OUTPUT + DFT_SCALE);
	//裁剪傅里叶逆变换
	image = image(Rect(0, 0, img.cols, img.rows));
        image.convertTo(image, CV_8UC1);
	return 0;
}

    原图:

傅里叶变换【1】:傅里叶变换及逆变换_第1张图片     

  复矩阵:

 傅里叶变换【1】:傅里叶变换及逆变换_第2张图片

  逆变换后的图:

傅里叶变换【1】:傅里叶变换及逆变换_第3张图片

你可能感兴趣的:(C++,Opencv,视觉算法)