根据各个滤波公式及前几章内容,可实现理想低通、理想高通、巴特沃思低通、巴特沃思高通、高斯低通、高斯高通滤波器;
效果图:
高斯低通 D0=30
巴特沃思低通 D0=30,n=2
理想低通D0=30:
高斯高通D0=80:
巴特沃思高通 D0=80,n=2
理想高通D0=80:
代码实现:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
cv::Mat image_make_border(cv::Mat &src )
{
int w=getOptimalDFTSize(src.cols);
int h=getOptimalDFTSize(src.rows);
Mat padded;
copyMakeBorder(src,padded,0,h-src.rows,0,w-src.cols,BORDER_CONSTANT,Scalar::all(0));
padded.convertTo(padded,CV_32FC1);
return padded;
}
//频率域滤波
Mat frequency_filter(Mat &scr,Mat &blur)
{
//***********************DFT*******************
Mat plane[]={scr, Mat::zeros(scr.size() , CV_32FC1)}; //创建通道,存储dft后的实部与虚部(CV_32F,必须为单通道数)
Mat complexIm;
merge(plane,2,complexIm);//合并通道 (把两个矩阵合并为一个2通道的Mat类容器)
dft(complexIm,complexIm);//进行傅立叶变换,结果保存在自身
//***************中心化********************
split(complexIm,plane);//分离通道(数组分离)
// plane[0] = plane[0](Rect(0, 0, plane[0].cols &a