opencv中傅里叶变换的使用

一、频率域滤波:

频率域滤波的原理:

频率直接关系到空间变化率,低频对应于图像中变化缓慢的灰度成分,较高的频率对应于图像中越来越快的灰度变化:      

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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值