MATLAB实现psf,C++实现Matlab的psf2otf函数
最近在用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函数相关推荐
- 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记
C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...
- matlab科学计算及分析,matlab科学计算
spContent=当前,科学计算已经成为科学研究.技术创新的重要方法与手段,而作为实现工具的科学计算软件无疑具有至关重要的作用.MATLAB为众多领域的计算问题提供了全面的解决方案,代表了当今国际科 ...
- matlab 自定义对象,面向对象:MATLAB的自定义类 [MATLAB]
这几天刚刚开始学习MATLAB的面向对象编程.以前做的事情都是用MATLAB写一些简单的脚本或者函数,这方面MATLAB成熟的函数和直截了当的矩阵运算方法和语法都很容易上手,方便人专注于算法本身.前几 ...
- matlab微分方程组边值,matlab求解常微分方程边值问题的方法
matlab求解常微分方程边值问题的方法 Matlab 求解常微分方程边值问题的方法:bvp4c 函数 常微分方程的边值问题,即 boundary value problems ,简称 BVP 问题, ...
- 基于matlab的信号去噪,基于matlab的信号去噪研究.doc
基于matlab的信号去噪研究.doc 学 生 毕 业 设 计(论 文) 课题名称 基于 MATLAB 的信号去噪研究 姓 名 陈文 学 号 051220206 院 系 物电系 专 业 电子信息工程 ...
- matlab负荷预测,负荷预测matlab
本文主要针对BP 神经网络 应用于电力系统短期负荷预测做了进一步的研究,并通过MATLAB设计BP神经 网络,仿真结果表明BP神经网络在短期负荷预测中的应用是可行的,能较好...... MATLAB ...
- matlab的实用与仿真,MATLAB建模与仿真实用教程
前言 第1章MATLAB建模基础 1.1 MATLAB简介 1.1.1 MATLAB的安装 1.1.2 MATLAB通用命令 1.1.3 MATLAB应用窗口简介 1.2 MATLAB数学建模概述 1 ...
- Matlab篇(二)MATLAB中addpath的用法 (转)
MATLAB help 中的语法: addpath('folderName1','folderName2','folderName3' ...) addpath('folderName1','fold ...
- MATLAB从入门到精通-MATLAB零矩阵eye()函数的几种应用场景
1.预备知识 单位阵eye()主要用于创建单位阵进行线性代数矩阵运算与求解,可以方便手动输入高纬多数的单位阵,节省时间! 打开MATLAB运行界面进行准备. 2.eye()函数基本规则 生成单位阵方法 ...
- MATLAB从入门到精通-MATLAB零矩阵zeros()函数使用方法汇总
1.预备知识 零矩阵zeros主要用于创建全零矩阵进行算法存储空间预分配,有效减少循环中定义变量维度的改变,提高仿真效率! 打开MATLAB运行界面进行准备. 2.zeros()函数用法 创建零矩阵主 ...
最新文章
- JPA中persistence.xml模板
- 手动配置 ESXi 主机挂载 NFS 的最大值
- 30岁前不必在乎的28件事
- php ar 模式,AR技术也被称为什么技术
- Oracle11g新特性:在线操作功能增强-Oracle11g的只读表功能
- C#中i=i++值不变的一个解释
- meta标签的另一个用法
- 定期删除30天以前的elasticsearch的日志
- Unity的学习笔记(XLua的初学用法并在lua中使用unity周期函数)
- Linux恢复数据软件,Linux数据恢复工具推荐
- Chrome 浏览器小恐龙游戏变身超级马利奥
- flask_uploads——“ImportError: cannot import name ‘secure_filename‘ from ‘werkzeug‘“
- 初见NVelocity模板引擎
- 系统试运行报告是谁写的_深圳个人信用报告查询系统入口https://ipcrs.pbccrc.org.cn/...
- Resnet152对102种花朵图像分类(PyTorch,迁移学习)
- 秦汉三国政治史:东汉宰相制度
- 想在家挣钱,这几个项目可以让你月入过万
- android手机不能发短信,小米4手机收短信正常但无法发送短信怎么办?
- “计算机的内存不足。请保存文件并关闭这些程序:xxx”解决方法
- 用python语言实现喇叭发声原理_用Python实现喇叭天线设计小工具(三)