图像的时域卷积相当于频域乘积,代码如下:
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//图像卷积(时域卷积相当于频域乘积)
void convolution(Mat src, Mat kernel, Mat& dst)
{
//输出图像定义
dst.create(abs(src.rows-kernel.rows+1),abs(src.cols-kernel.cols+1),src.type());
Size dftSize;
//计算傅里叶变换尺寸,为了计算速度更快,一般尺寸是2,3,5的倍数速度更快
dftSize.width = getOptimalDFTSize(src.cols+kernel.cols-1);
dftSize.height = getOptimalDFTSize(src.rows+kernel.rows-1);
//临时图像初始化为0
Mat tempA(dftSize,src.type(),Scalar::all(0));
Mat tempB(dftSize,src.type(),Scalar::all(0));
//区域拷贝
Mat roiA(tempA,Rect(0,0,src.cols,src.rows));
src.copyTo(roiA);
Mat roiB(tempB,Rect(0,0,kernel.cols,kernel.rows));
kernel.copyTo(roiB);
//傅里叶变换
dft(tempA,tempA,0,src.rows);
dft(kernel,kernel,0,kernel.rows);
//对两