在Matlab中有個psf2otf()函數,能夠將小尺寸的點擴散函數,擴大尺寸,並做二維傅里葉變換,opencv中沒有這個函數,因此編了這麼個函數:html
/*****************************
Mat psf2otf(const Mat&psf, Size outSize=Size(3,3))
參數說明:
psf——輸入的點擴散函數;
outSize——是輸出otf的尺寸;函數
在本程序中,還調用了circShift()函數,該函數具體參見:
http://www.cnblogs.com/phoenixdsg/p/8425336.html測試
本程序中,還調用了mymax()函數和myMagnitude()函數,難度不大本身想辦法吧。spa
*******************************/code
下面是psf2otf()函數的定義:htm
{ 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; }
下面是對該函數的測試程序:blog
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; }
輸出結果以下:ci