转载请注明出处:

http://www.cnblogs.com/darkknightzh/p/5462665.html

参考网址:

http://blog.csdn.net/lichengyu/article/details/18848281

貌似还有其他的,记不清了

convolveDFT函数是从官方文档中抄录并做了修改,因为原来的程序有问题。一是输出Mat C应声明为引用;二是其中的mulSpectrums函数的第四个参数flag值没有指定,应指定为DFT_COMPLEX_OUTPUT或是DFT_REAL_OUTPUT.

main函数中首先按灰度图读入图像,然后创造一个平滑核kernel,将输入图像转换成float类型(注意这步是必须的,因为dft只能处理浮点数),在调用convolveDFT求出卷积结果后,将卷积结果归一化方便显示观看。

(180205:_XieLei 指出valid的时候结果不对,大家辩证的看待代码哈)

 #include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv; enum ConvolutionType // 函数 conv2 卷积时参数的类型
{
CONVOLUTION_FULL, // 卷积时的参数,和 matlab 的 full 一致
CONVOLUTION_SAME, // 卷积时的参数,和 matlab 的 same 一致
CONVOLUTION_VALID // 卷积时的参数,和 matlab 的 valid 一致
};
void Conv2DFT(Mat& convRes, const Mat& img, const Mat& kernel, ConvolutionType type, int ddepth)
{
int dft_M = getOptimalDFTSize(img.rows + kernel.rows - ); // 行数
int dft_N = getOptimalDFTSize(img.cols + kernel.cols - ); // 列数 Mat imagePad(dft_M, dft_N, CV_32FC1, Scalar());
Mat imagePadROI = imagePad(Rect(, , img.cols, img.rows));
img.convertTo(imagePadROI, CV_32FC1, , ); Mat kernelPad(dft_M, dft_N, CV_32FC1, Scalar());
Mat kernelPadROI = kernelPad(Rect(, , kernel.cols, kernel.rows));
kernel.convertTo(kernelPadROI, CV_32FC1, , ); dft(imagePad, imagePad, , imagePad.rows);
dft(kernelPad, kernelPad, , kernelPad.rows); // set the last parameter to false to compute convolution instead of correlation
mulSpectrums(imagePad, kernelPad, imagePad, DFT_COMPLEX_OUTPUT, false); // false: A.*B;true:xf.*conj(yf)
idft(imagePad, imagePad, cv::DFT_SCALE | cv::DFT_REAL_OUTPUT, imagePad.rows); Rect r;
switch (type)
{
case CONVOLUTION_FULL: // full
r = Rect(, , img.cols + kernel.cols - , img.rows + kernel.rows - );
break;
case CONVOLUTION_SAME: // same
r = Rect((kernel.cols + 0.5) / , (kernel.rows + 0.5) / , img.cols, img.rows);
break;
case CONVOLUTION_VALID: // valid
r = Rect((kernel.cols + 0.5) / , (kernel.rows + 0.5) / , img.cols - kernel.cols + , img.rows - kernel.rows + );
break;
default: // same
r = Rect((kernel.cols + 0.5) / , (kernel.rows + 0.5) / , img.cols, img.rows);
break;
} imagePad(r).convertTo(convRes, ddepth, , );
}

说明:

不确定矩形框是否正确。

(原+转)使用opencv的DFT计算卷积的更多相关文章

  1. 14 用DFT计算线性卷积

    用DFT计算线性卷积 两有限长序列之间的卷积 我们知道,两有限长序列之间的卷积可以用圆周卷积代替,假设两有限长序列的长度分别为\(M\)和\(N\),那么卷积后的长度为\(L=M+N-1\),那么用 ...

  2. (原)使用intel的ipp库计算卷积及相关

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462631.html 参考网址: https://software.intel.com/zh-cn/n ...

  3. DFT计算过程详解

    DFT计算过程详解 平时工作中,我们在计算傅里叶变换时,通常会直接调用Matlab中的FFT函数,或者是其他编程语言中已经为我们封装好的函数,很少去探究具体的计算过程,本文以一个具体的例子,向你一步一 ...

  4. opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移

    常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...

  5. Opencv中integral计算积分图

    Paul Viola和Michael Jones在2001年首次将积分图应用在图像特征提取上,在他们的论文"Rapid Object Detection using a Boosted Ca ...

  6. opencv使用convexityDefects计算轮廓凸缺陷

    引自:http://www.xuebuyuan.com/1684976.html http://blog.csdn.net/lichengyu/article/details/38392473 htt ...

  7. 【OpenCV学习】计算两幅图像的重叠区域

    问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图 ...

  8. OpenCV——积分图计算

    #include <opencv2/opencv.hpp> #include <iostream> #include "math.h" using name ...

  9. opencv之dft及mat类型转换

    跑实验时用到dft这个函数,根据教程,需要先将其扩充到最优尺寸,但我用逆变换后发现得到的mat的维数竟然不一样.因此还是不要扩展尺寸了. 参考:http://www.xpc-yx.com/2014/1 ...

随机推荐

  1. SMBUS(IIC)总线

    1.SPI和IIC一般都作为板上通信,UART.SMBUS和USB一般都作为板间通信. 其中SMBUS是参考IIC制定出来的眼生病,两者很像. 2.SMBUS的I/O接口是由两条线组成的双向串行总线. ...

  2. ubuntu中安装jdk

    1.下载jdk压缩包: http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz 2.解压缩jdk ...

  3. Oracle11g R2学习系列 之二基本概念和环境介绍

    昨天安装好了之后,发现用Chrome打开OEM发现是英文的,搞得我好奇怪:安装时明明自动显示的是中文的,为何会是英文的呢.后来想想会不会是Oracle用的是浏览器的语言呢,果断打开Chrome的设置, ...

  4. jQuery 文字截取

    HTML <div class="summary">    <p class="news">业内知道,当赵科林“过档”联想之初,恰逢联想 ...

  5. javascript-几个基础的排序算法

    对这几个基础排序算法进行梳理,便于以后查看. /** * * 冒泡排序 * 从末尾开始相邻两数相互比较大小,满足条件就交换位置.循环每进行一次,即可确定第i位数的值. *冒泡排序的时间复杂度为O(n^ ...

  6. DESTOON伪静态的设置/news/1.html格式

    在本地测试了,DT默认伪静态格式是这样http://127.0.0.2/news/show/1.htmlhttp://127.0.0.2/news/show1-1.html但是这种不利于seo优化所以 ...

  7. 在windows下获取硬盘序列号(win7 32位,Windows Server 64位测试,希望在其他平台测试,遇到问题的网友留言分享)

    #include <Windows.h> #include <stdio.h> // IOCTL控制码 // #define DFP_SEND_DRIVE_COMMAND CT ...

  8. python文件_批量改名

    #! /usr/bin/env python #coding=gbk #文件操作实例--将文件夹下所有图片名称加上'_test' import re,os,time #str.split(path) ...

  9. Json.Net从4.0升级到7.0带来的问题

    1.由于被迫Json.Net升级,导致了我们一部分查询出来数据 2.分析原因result = JsonConvert.DeserializeObject(inputContent, JsonDataT ...

  10. libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结

    说法一: 我们在运行xcode工程时,有时候会遇到”libc++abi.dylib: terminate_handler unexpectedly threw an exception”错误,app莫 ...