opencv学习(十三)离散傅里叶变换dft()//getOptimalDFTSize/copyMakeBorder边界扩展//magnitude()二维幅值/log()/normalize()归一化

5人阅读 评论(0) 收藏 举报
分类:

离散傅里叶变换

这里写图片描述
这里写图片描述

1,dft()函数详解

这里写图片描述
这里写图片描述

2,返回dft最优尺寸大小函数getOptimalDFTSize()

这里写图片描述

3,copyMakeBorder()边界扩充函数

这里写图片描述
这里写图片描述

4,计算二维矢量幅值函数magnitude()

这里写图片描述

5,求对数函数log()

这里写图片描述

6,矩阵归一化函数normalize()

这里写图片描述
这里写图片描述

傅里叶函数应用例子

这里写图片描述

最终效果图

这里写图片描述

#include<opencv2/opencv.hpp>
using namespace cv;

//主函数
int main()
{
    //①以灰度图像读取
    Mat srcimage = imread("D://1.jpg", 0);
    if (!srcimage.data) { printf("falsch!\n"); return false; }
    imshow("原始图像", srcimage);

    //2,将输入尺寸扩大到最佳尺寸,边界用0填充
    int m = getOptimalDFTSize(srcimage.rows);
    int n = getOptimalDFTSize(srcimage.cols);
    Mat padded;
    copyMakeBorder(srcimage, padded, 0, m - srcimage.rows, 0, n - srcimage.cols, BORDER_CONSTANT, Scalar::all(0));//初始化元素为0,扩充

    //3,傅里叶变化结果(实部虚部)分配储存空间
    //将plannes数组组合合并成一个多通道的数组complexI
    Mat plannes[]
        = { Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F) };//式子中每个函数何解???
    Mat complexI;
    merge(plannes,2, complexI);


//4,进行就地傅里叶变换
    dft(complexI, complexI);

    //5,将复数转化为幅值,即log(1+sqrt(Re(DFT(I)^2+Im(DFT(I)))^2)
    split(complexI, plannes);//多通道分离为几个单通道数组,plannes[0]=Re(DFT(I),plannes[1]=Im(DFT(I)
    magnitude(plannes[0], plannes[1], plannes[0]);
    Mat magnitudeImage = plannes[0];

    //6,进行对数尺度(logarithmic scale)缩放
    magnitudeImage+= Scalar::all(1);//等效于  magnitudeImage = magnitudeImage + Scalar::all(1);
    log(magnitudeImage, magnitudeImage);//求自然对数


    //7,剪切和重新分布幅度图象限
    //若有奇数行/列,进行频谱裁剪
    magnitudeImage = magnitudeImage(Rect(0, 0, magnitudeImage.cols&-2, magnitudeImage.rows&-2));
    //重新排列傅里叶图像的象限,是的原点位于图像中心
    int cx = magnitudeImage.cols / 2;
    int cy = magnitudeImage.rows / 2;
    Mat q0(magnitudeImage, Rect(0, 0, cx, cy));//Roi区域的左上,右上,左下,右下
    Mat q2(magnitudeImage, Rect(0, cy, cx, cy));
    Mat q3(magnitudeImage, Rect(cx, cy, cx, cy));
    Mat q1(magnitudeImage, Rect(cx, 0, cx, cy));


    //交换象限(左上和右下)
    Mat tmp;
    q0.copyTo(tmp);
    q3.copyTo(q0);
    tmp.copyTo(q3);

    //交换象限(右上与左下)
    q1.copyTo(tmp);
    q2.copyTo(q1);
    tmp.copyTo(q2);

    //8,归一化,用0到1间的浮点数将矩阵变化为可视的图像格式
    normalize(magnitudeImage, magnitudeImage, 0, 1, NORM_MINMAX);

    //9,显示效果原图
    imshow("频谱幅值", magnitudeImage);
    waitKey();

    return 0;





}
查看评论

第六章 - 图像变换 - 卷积和离散傅里叶变换DFT(cvDFT)

利用DFT可以大大加快卷积运算的速度,因为卷积定理说明空间域的卷积运算可以转换为频域的乘法运算。 --------------------------------------------------...
  • hitwengqi
  • hitwengqi
  • 2011-10-22 21:05:50
  • 15198

【OpenCV笔记 09】OpenCV中离散傅里叶变换、归一化的运用

本文主要介绍怎样使用opencv来对图片进行傅里叶变换,其核心函数是opencv自带的dft()。离散傅里叶变换DFT(Discrete Fourier Transform)这个技术手段是将空间域映...
  • sinat_34707539
  • sinat_34707539
  • 2016-07-18 15:13:08
  • 1248

Opencv图像识别从零到精通(36)----DFT离散傅里叶变换

这篇就是图像的时域到频域的开始,也是信号处理中比较常见的傅立叶变换。 一、傅立叶图像   对一张图像使用傅立叶变换就是将它分解成正弦和余弦两部分。也就是将图像从空间域(spatial doma...
  • qq_20823641
  • qq_20823641
  • 2016-08-27 17:40:48
  • 6135

opencv之离散傅里叶变换(DFT)

opencv之离散傅里叶变换 [+] 函数解读: C++: intgetOptimalDFTSize(int vecsize) 源码解读; [cpp] view plain c...
  • ycl295644
  • ycl295644
  • 2016-07-16 16:56:30
  • 1668

离散傅里叶变换 The Discrete Fourier Transform (DFT)

The Discrete Fourier Transform (DFT) The Java code to calculate the basic Discrete Fourier Transfor...
  • GarfieldEr007
  • GarfieldEr007
  • 2015-12-30 12:54:25
  • 1195

《数字图像处理》第三版笔记(五)二维离散傅立叶DFT

《数字图像处理》第三版 Rafael C. Gonzalez等著 花了1,2个月断续的看书,终于有些进展了,一直到DFT这里,偏理论些。 到现在我都不清楚弄出图片的DFT的振幅图像,相位图来干啥的...
  • penkee
  • penkee
  • 2017-03-28 21:30:37
  • 529

opencv:计算二维矢量的幅值—magnitude()函数

计算二维矢量的幅值:magnitude()函数 该函数用来计算二维矢量的幅值 void magnitude(InputArray x,InputArray y,OutputArray magnit...
  • qq_31935691
  • qq_31935691
  • 2017-05-11 23:49:35
  • 1059

学习OpenCV范例(八)——离散傅立叶变换

离散傅里叶变换到目前为止还是没有十分的了解,也从信号处理的资料中了解一些,但是还是有点朦胧,在这里我也不多谈论,我觉得OpenCV教程中介绍得虽然简单,但是大概意思还是有涵盖到,对于初学者还是比较容易...
  • chenjiazhou12
  • chenjiazhou12
  • 2014-03-16 15:02:40
  • 6641

c++ DFT 二维傅里叶变换

最近写了一个计算图像
  • lcbwlx
  • lcbwlx
  • 2014-10-27 18:10:11
  • 2211

图像二维离散傅里叶变换、幅度谱、相位谱

clear, clc I = imread('...');F = fftshift(fft2(I)); % 对图像进行二维 DFT(fft2),并移至中心位置 ...
  • lanchunhui
  • lanchunhui
  • 2016-10-05 14:59:52
  • 2377
    个人资料
    持之以恒
    等级:
    访问量: 0
    积分: 170
    排名: 0
    文章分类
    文章存档