一、频率域滤波:
频率域滤波的原理:
频率直接关系到空间变化率,低频对应于图像中变化缓慢的灰度成分,较高的频率对应于图像中越来越快的灰度变化:
1.频谱的直流低频分量对应于图像的平滑区域
2.频率的高频分量对应于图像的边沿或变化剧烈区域
3.外界叠加噪声对应于频谱中频率较高的成分
4.恒定的干扰条纹对应于频谱中的某些特征点
频率域的滤波技术的基础:修改傅里叶变换以达到特殊的目的,然后计算IDFT返回到图像域,我们修改傅里叶变换主要是修改变换之后的幅度和相角。
opencv中步骤不是唯一的,我所知道的步骤如下:
1.首先找到最适合做dft的宽和高,根据找到的宽和高扩充图像
2.将图像进行中心化
3.对图像进行傅里叶变换
4.根据H(u,v),得到与扩充后的图像大小相同的模板
5. 使用矩阵的对应相乘得到G(u,v)
6.进行傅里叶反变换得到处理之后的结果。
二、下面是在网上找到的两个比较有代表性的代码
1.这个代码是对图像进行低通和高通进行处理
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
int main(){
cv::Mat src=cv::imread("../1.jpg",0);
if(src.empty()){
std::cout<<"could not load image"<<std::endl;
return -1;
}
cv::imshow("src",src);
int w=cv::getOptimalDFTSize(src.cols);
int h=cv::getOptimalDFTSize(src.rows);
cv::Mat padded;
cv::copyMakeBorder(src,padded,0,h-src.rows,0,w-src.cols,cv::BORDER_DEFAULT,cv::Scalar::all(0));
padded.convertTo(padded,CV_32FC1);
cv::imshow("padded",padded);
for(int i=0;i<padded.rows;i++){
float *ptr=padded.ptr<float>(i);
for(int j=0;j<padded.cols;j++){
ptr[j]*=pow(-1,i+j);
}
}
cv::imshow("hahha",padded);
Mat plane[]={padded,Mat::zeros(padded.size(),CV_32F)};
Mat CompleImg;
merge(plane,2,CompleImg);
dft(CompleImg,CompleImg);
cv::Mat gaussianBlur(padded.size(),CV_32FC2);
cv::Mat gaussianSharp(padded.size(),CV_32FC2);
float D0=2*10*10;
for(int i=0;i<padded.rows;i++){
float *p=gaus