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;
}

輸出結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM