最近在用C++实现L0Smooth的代码,其中里面用到了psf2otf这个函数,但是OpenCV没有,因此我自写了一个。

关于这个函数的介绍,你可以参考Matlab的官方文档及其源代码,也可以参考这里写的一个记录,这里不做过多介绍了。

代码

/** * FileName : filter.cpp * Version : 0.10 * Author : WinCoder * Date : 2015-10-11 10:22:21 * Comment : Implenment Matlab psf2osf function. */

Mat psf2otf(Mat psf, Size size)

{

Mat otf = Mat::zeros(size.height,size.width,psf.type());

// Pad the PSF to outSize

Size dftSize;

// compute the size of DFT transform

dftSize.width = getOptimalDFTSize(size.width);

dftSize.height = getOptimalDFTSize(size.height);

// allocate temporary buffers and initialize them with 0's

Mat temp(dftSize, psf.type(), Scalar::all(0));

//copy psf to the top-left corners of temp

Mat roipsf(temp,Rect(0,0,psf.cols,psf.rows));

psf.copyTo(roipsf);

// Circularly shift otf so that the "center" of the PSF is at the

// (0,0) element of the array.

Mat psf2 = temp.clone();

int cx = psf.cols/2;

int cy = psf.rows/2;

Mat p0(temp, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant

Mat p1(temp, Rect(cx, 0, psf2.cols-cx, cy)); // Top-Right

Mat p2(temp, Rect(0, cy, cx, psf2.rows - cy)); // Bottom-Left

Mat p3(temp, Rect(cx,cy, psf2.cols-cx, psf2.rows - cy)); // Bottom-Right

Mat q0(psf2, Rect(0, 0, psf2.cols-cx, psf2.rows - cy));// Top-Left - Create a ROI per quadrant

Mat q1(psf2, Rect(psf2.cols-cx, 0, cx, psf2.rows - cy));// Top-Right

Mat q2(psf2, Rect(0, psf2.rows - cy, psf2.cols-cx, cy)); // Bottom-Left

Mat q3(psf2, Rect(psf2.cols-cx, psf2.rows - cy,cx,cy)); // Bottom-Right

// swap quadrants (Top-Left with Bottom-Right)

p0.copyTo(q3);

p3.copyTo(q0);

// swap quadrant (Top-Right with Bottom-Left)

p1.copyTo(q2);

p2.copyTo(q1);

// Computer the OTF

Mat planes[] = {Mat_(psf2), Mat::zeros(psf2.size(), CV_32F)};

Mat complexI;

merge(planes, 2, complexI);

dft(complexI, complexI);

otf = complexI;

return otf(Range(0,size.height),Range(0,size.width));

}

说明

这个程序使用了OpenCV库,我使用的版本是OpenCV300,其他版本也是可以的。

程序是先将矩阵填充到输出大小,然后将原始psf的中心移动到左上角,matlab中psf2otf函数中使用了circshift函数(可以查看其源代码),OpenCV好像没有这个函数,这里我就直接将矩阵分成四个象限,然后将1和3象限对调,2和4象限对调。

值得说明的是OpenCV中傅里叶变换输出有两种格式 全复数输出(full-complex output,占用两个矩阵大小)和复数共轭对称压缩输出(Complex Conjugate Symmetric (CCS) packed output,一个矩阵大小) 。为了生活保持简单和美好,我个人偏向于全复数格式输出,关于 CCS 格式说明见OpenCV官文dft。

测试

测试了几个例子,代码正确。

参考资料

Matlab中psf2otf.m源码

转载请保留以下信息

作者

日期

联系方式

风吹夏天

2015年10月11日

wincoder@qq.com

MATLAB实现psf,C++实现Matlab的psf2otf函数相关推荐

  1. 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记

    C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...

  2. matlab科学计算及分析,matlab科学计算

    spContent=当前,科学计算已经成为科学研究.技术创新的重要方法与手段,而作为实现工具的科学计算软件无疑具有至关重要的作用.MATLAB为众多领域的计算问题提供了全面的解决方案,代表了当今国际科 ...

  3. matlab 自定义对象,面向对象:MATLAB的自定义类 [MATLAB]

    这几天刚刚开始学习MATLAB的面向对象编程.以前做的事情都是用MATLAB写一些简单的脚本或者函数,这方面MATLAB成熟的函数和直截了当的矩阵运算方法和语法都很容易上手,方便人专注于算法本身.前几 ...

  4. matlab微分方程组边值,matlab求解常微分方程边值问题的方法

    matlab求解常微分方程边值问题的方法 Matlab 求解常微分方程边值问题的方法:bvp4c 函数 常微分方程的边值问题,即 boundary value problems ,简称 BVP 问题, ...

  5. 基于matlab的信号去噪,基于matlab的信号去噪研究.doc

    基于matlab的信号去噪研究.doc 学 生 毕 业 设 计(论 文) 课题名称 基于 MATLAB 的信号去噪研究 姓 名 陈文 学 号 051220206 院 系 物电系 专 业 电子信息工程 ...

  6. matlab负荷预测,负荷预测matlab

    本文主要针对BP 神经网络 应用于电力系统短期负荷预测做了进一步的研究,并通过MATLAB设计BP神经 网络,仿真结果表明BP神经网络在短期负荷预测中的应用是可行的,能较好...... MATLAB ...

  7. matlab的实用与仿真,MATLAB建模与仿真实用教程

    前言 第1章MATLAB建模基础 1.1 MATLAB简介 1.1.1 MATLAB的安装 1.1.2 MATLAB通用命令 1.1.3 MATLAB应用窗口简介 1.2 MATLAB数学建模概述 1 ...

  8. Matlab篇(二)MATLAB中addpath的用法 (转)

    MATLAB help 中的语法: addpath('folderName1','folderName2','folderName3' ...) addpath('folderName1','fold ...

  9. MATLAB从入门到精通-MATLAB零矩阵eye()函数的几种应用场景

    1.预备知识 单位阵eye()主要用于创建单位阵进行线性代数矩阵运算与求解,可以方便手动输入高纬多数的单位阵,节省时间! 打开MATLAB运行界面进行准备. 2.eye()函数基本规则 生成单位阵方法 ...

  10. MATLAB从入门到精通-MATLAB零矩阵zeros()函数使用方法汇总

    1.预备知识 零矩阵zeros主要用于创建全零矩阵进行算法存储空间预分配,有效减少循环中定义变量维度的改变,提高仿真效率! 打开MATLAB运行界面进行准备. 2.zeros()函数用法 创建零矩阵主 ...

最新文章

  1. JPA中persistence.xml模板
  2. 手动配置 ESXi 主机挂载 NFS 的最大值
  3. 30岁前不必在乎的28件事
  4. php ar 模式,AR技术也被称为什么技术
  5. Oracle11g新特性:在线操作功能增强-Oracle11g的只读表功能
  6. C#中i=i++值不变的一个解释
  7. meta标签的另一个用法
  8. 定期删除30天以前的elasticsearch的日志
  9. Unity的学习笔记(XLua的初学用法并在lua中使用unity周期函数)
  10. Linux恢复数据软件,Linux数据恢复工具推荐
  11. Chrome 浏览器小恐龙游戏变身超级马利奥
  12. flask_uploads——“ImportError: cannot import name ‘secure_filename‘ from ‘werkzeug‘“
  13. 初见NVelocity模板引擎
  14. 系统试运行报告是谁写的_深圳个人信用报告查询系统入口https://ipcrs.pbccrc.org.cn/...
  15. Resnet152对102种花朵图像分类(PyTorch,迁移学习)
  16. 秦汉三国政治史:东汉宰相制度
  17. 想在家挣钱,这几个项目可以让你月入过万
  18. android手机不能发短信,小米4手机收短信正常但无法发送短信怎么办?
  19. “计算机的内存不足。请保存文件并关闭这些程序:xxx”解决方法
  20. 用python语言实现喇叭发声原理_用Python实现喇叭天线设计小工具(三)

热门文章

  1. UVM-入门实验2_uvm代码实现
  2. Java面试题及答案2020,安卓java编程软件app
  3. 月下夜想曲200.6(攻略2)
  4. 洛谷4315 月下“毛景树”(树链剖分)
  5. 系统思考:VUCA时代下的我们应该怎么做?
  6. 简单理解下用户体验五要素
  7. 三方TabNavigator“斗艳”(Flex、JQuery UI和DoJo)
  8. Forwarding Address字段
  9. linux gpio口测试程序,gpio接口测试
  10. mount的挂载远程服务器文件夹