Matlab中psf2otf()函数在opencv中的实现

在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/2,paddSize.height/2,
                       paddSize.width/2 ,paddSize.width/2,
                       BORDER_CONSTANT,Scalar(0));
        circShift(otf,-otf.size().height/2,-otf.size().width/2);
        otf=fft(otf);
        //计算psf的元素个数
        int nElem=psf.cols*psf.rows;

        double nOps=0;

        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[2];
        split(otf,planes);
        double imagin_max=mymax(abs(planes[1]));
        double mag_max=mymax(myMagnitude(otf));

        if((imagin_max/mag_max)<eps)
            return planes[0];

    }
    return otf;
}

下面是对该函数的测试程序:

int main()
{
    Mat mat=(Mat_<double>(3,3)<<
             0,-1,0,
             -1,4,-1,
             0,-1,0);
    Mat otf=psf2otf(mat);
    cout<<otf<<endl;
    return 0;
}

输出结果如下:

原文地址:https://www.cnblogs.com/phoenixdsg/p/9058044.html

时间: 2024-08-27 04:02:12

Matlab中psf2otf()函数在opencv中的实现的相关文章

python中的函数存入list中的实例

最近由于接触了python这个强大的东西,在写代码时考虑到代码的扩展性,就想到了将python的函数名存入list中.有点像习惯的c/c++中的函数指针的意思. 下面上代码: 1 # coding=utf-8 2 #!/usr/bin/python 3 #脚本的用法 python nn_daemon.py 4 import json, urllib, urllib2, subprocess, sys, os, logging, time, socket, time, calendar, date

shell中的函数、shell中的数组、告警系统需求分析

20.16-20.17 shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function f_name() { command } 函数必须要放在最前面 脚本实例1 #!/bin/bash function inp(){ echo $1 $2 $3 $0 $# } inp 1 a 2 脚本实例2 #!/bin/bash sum() { s=$[$1+$2] echo $s } sum 1 2 脚本实例3

七十、shell中的函数、shell中的数组、告警系统需求分析

一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可.函数就是一个子shell,一个代码段. shell中的函数必须要定义在脚本的最上面. 格式: function f_name() { command }函数必须要放在最前面 f_name:函数名,最好不要和shell中的一些关键词冲突,比如for. command:具体命令 function这个单词可以省略掉的. 示例1 #!//bin/bash functio

shell脚本中的函数,shell中的数组,shell项目-告警系统

shell脚本中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function f_name() {command }函数必须要放在最前面,function可以省略直接写函数名 示列1,打印shell的参数 [[email protected] shell]# cat fun1.sh #!/bin/bash function inp(){ echo "the first par is $1" echo

mysql中UNIX_TIMESTAMP()函数和php中time()函数的区别

http://tech.ddvip.com/2009-01/1231392775105351.html mysql 中:UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) 若无参数调用,则返回一个 Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒数) 作为无符号整数.若用date 来调用 UNIX_TIMESTAMP(),它会将参数值以'1970-01-01 00:00:00' GMT后的秒数的形式返回.date 可以是一个

SQLserver中ISNULL函数与Mysql中IFNULL函数的用法

本文介绍下,sql server中的isnull函数,以及mysql中的ifnull函数,介绍二者的具体用法与区别,有兴趣的朋友可以研究下哦. 先来看SQL Serve的ISNULL函数: ISNULL(check_expression,replacement_value) 1.check_expression与replacement_value的数据类型必须一致. 2.如果check_expression为NULL,则返回replacement_value. 3.如果check_express

QT中使用 slot 传递 opencv 中得Mat对象以及 使用多线程集成开源代码。

关于 slot传递 Mat 对象 以前一直是使用 Qtimer 定时器,设定超时后读取 dialog 对象的 Mat成员实现在 UI 里显示图像,发现这样对以后集成其他面向过程的代码增加了复杂度. 所以考虑使用 slot 即使用多线程处理图像后,发送 signal 给 dialog对象,dialog中 connect 他们就行了. 子线程.cpp ... for(;;){ ... emit imageChanged (labelImg); ... } emit finished(); ... d

matlab 中max函数用法

Matlab中max函数在矩阵中求函数大小的实例如下:(1)C = max(A)返回一个数组各不同维中的最大元素.如果A是一个向量,max(A)返回A中的最大元素.如果A是一个矩阵,max(A)将A的每一列作为一个向量,返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值. 如果A是多维数组,max(A) treats the values along the first non-singleton dimension as vectors, returning the maximum v

Opencv中直方图函数calcHist

calcHist函数在Opencv中是极难理解的一个函数,一方面是参数说明晦涩难懂,另一方面,说明书给出的实例也不足以令人完全搞清楚该函数的使用方式.最难理解的是第6,7,8个参数dims.histSize和ranges.以前一直都是想当然认为,该函数可以一次统计多张图片每个通道的灰度值数据,实际上calcHist函数一次只能统计一个通道上的直方图.我估计许多同学都犯过和我类似的错误,认为第5个参数hist,可以根据dims设定维度,比如dims=3,则输出的hist的维度就是3,并且会想当然的