Matlab中psf2otf()函数在opencv中的实现
2024-09-02 09:32:46
在Matlab中有个psf2otf()函数,可以将小尺寸的点扩散函数,扩大尺寸,并作二维傅里叶变换,opencv中没有这个函数,所以编了这么个函数:
/*****************************
Mat psf2otf(const Mat&psf, Size outSize=Size(3,3))
参数说明:
psf——输入的点扩散函数;
outSize——是输出otf的尺寸;
在本程序中,还调用了circShift()函数,该函数具体参见:
http://www.cnblogs.com/phoenixdsg/p/8425336.html
本程序中,还调用了mymax()函数和myMagnitude()函数,难度不大自己想办法吧。
*******************************/
下面是psf2otf()函数的定义:
{ Mat otf;
if(countNonZero(psf)&&!psf.empty())
{
Size psfSize=psf.size(); Size paddSize=outSize-psfSize;
copyMakeBorder(psf,otf,paddSize.height/,paddSize.height/,
paddSize.width/ ,paddSize.width/,
BORDER_CONSTANT,Scalar());
circShift(otf,-otf.size().height/,-otf.size().width/);
otf=fft(otf);
//计算psf的元素个数
int nElem=psf.cols*psf.rows; double nOps=; int nfft=nElem/psfSize.width;
nOps +=nfft+psfSize.width*log2(psfSize.width)*nfft;
nfft=nElem/psfSize.height;
nOps +=nfft+psfSize.width*log2(psfSize.height)*nfft;
//将复数otf分解成实部real和虚部imagin
Mat planes[];
split(otf,planes);
double imagin_max=mymax(abs(planes[]));
double mag_max=mymax(myMagnitude(otf)); if((imagin_max/mag_max)<eps)
return planes[]; }
return otf;
}
下面是对该函数的测试程序:
int main()
{
Mat mat=(Mat_<double>(,)<<
,-,,
-,,-,
,-,);
Mat otf=psf2otf(mat);
cout<<otf<<endl;
return ;
}
输出结果如下:
最新文章
- asp.net core 如何在Controller获取配置文件的值
- CSharpGL(0)一个易学易用的C#版OpenGL
- mysql 正则
- o2o的一些看法
- iOS之文本属性Attributes的使用
- 转---在ASP.NET MVC中实现登录后回到原先的界面
- NVL函数(NVL,NVL2,NULLIF,COALESCE)
- 有感于NC的强大
- .NET WIN7+IIS 7.5下URLRewriter组件伪静态设置
- Delphi 的动态数组
- 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
- leetcode — pascals-triangle
- Django基础-01
- windows7 安装pytorch
- qnx spi 学习笔记
- Hibernate 二(一级缓存,多表设计之一对多)
- SharePoint 2013 Workflow Manager 1.0 卸载
- NodeJS的url验证库模块url-valid
- 两数据库Dblink数据抽取blob
- AngularJS学习 之 创建项目