psf2otf函数和otf2psf函数
在使用Opencv做傅里叶变换(FFT)的时候,经常会用到MATLAB中的psf2otf函数和otf2psf函数,关于psf 和 otf 的含义可参考MATLAB官网。psf2otf函数已经有很多博主实现,可参见C++实现Matlab的psf2otf函数和基于C++的psf2otf实现 两篇优秀的博文。
由于自己还用到了MATLAB中的otf2psf函数,于是自己实现了,C++的运行结果和MATLAB中的函数运行结果一致。
otf2psf函数的实现
otf2psf函数的实现正好是psf2otf函数的逆过程,所以函数实现过程为:
- 采用逆傅里叶变换函数ifft,将otf还原为psf(中心点还需移动)
- 然后循环移动psf矩阵的值向上(或向左),直到中心像素到达(0,0)位置
需要强调的是,psf2otf和otf2psf循环移动的次数不同。psf2otf的移动次数为:psf.size/2
;otf2psf的移动次数为:psf.size/2+1
。
具体代码(opencv3)
Mat otf2psf(Mat otf, Size size)
{
Mat planes[] = {
Mat(otf.size(), CV_32F), Mat(otf.size(), CV_32F