函數解讀:
C++: int getOptimalDFTSize(int vecsize)
源碼解讀;
-
<span style="font-size:18px;">int cv::getOptimalDFTSize( int size0 )
-
{
-
int a = 0, b = sizeof(optimalDFTSizeTab)/sizeof(optimalDFTSizeTab[0]) -1;
-
if( (unsigned)size0 >= (unsigned)optimalDFTSizeTab[b] )
-
return -1;
-
-
while( a < b )
-
{
-
int c = (a + b) >> 1;
-
if( size0 <= optimalDFTSizeTab[c] )
-
b = c;
-
else
-
a = c+1;
-
}
-
-
returnoptimalDFTSizeTab[b];
-
}</span>
optimalDFTSizeTab定義在namespace cv中,裏邊的數值爲2^x*3^y*5^z
static const int optimalDFTSizeTab[] = {1,2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16,…, 2123366400, 2125764000};
copyMakeBorder
C++: void copyMakeBorder(InputArraysrc, OutputArray dst, int top, int bottom, int left,int right, int borderType,
const Scalar& value=Scalar())
src: 源圖像
dst: 目標圖像,和源圖像有相同的類型,dst.cols=src.cols+left+right; dst.rows=src.rows+dst.top+dst.bottom
top:
bottom:
left:
right: 以上四個參數指定了在src圖像周圍附加的像素個數。
borderType: 邊框類型
value: 當borderType==BORDER_CONSTANT時需要指定該值。
示例代碼:
-
<span style="font-size:18px;">#include <opencv2/core/core.hpp>
-
#include<opencv2/highgui/highgui.hpp>
-
#include<opencv2/imgproc/imgproc.hpp>
-
#include <iostream>
-
-
using namespace cv;
-
using namespace std;
-
-
int main(){
-
Mat src = imread("fruits.jpg");
-
if(!src.data)
-
{
-
return -1;
-
}
-
-
Mat src_gray;
-
cvtColor(src,src_gray,CV_RGB2GRAY);
-
-
int m = getOptimalDFTSize(src_gray.rows);
-
int n = getOptimalDFTSize(src_gray.cols);
-
-
Mat dst;
-
-
copyMakeBorder(src_gray,dst,0,m-src_gray.rows,0,n-src_gray.cols,BORDER_CONSTANT,Scalar::all(0));
-
cout<<dst.size()<<endl;
-
-
-
Mat planes[] = {Mat_<float>(dst), Mat::zeros(dst.size(), CV_32F)};
-
Mat completeI;
-
merge(planes,2,completeI);
-
-
-
dft(completeI,completeI);
-
-
split(completeI,planes);
-
magnitude(planes[0],planes[1],planes[0]);
-
-
Mat magI = planes[0];
-
-
-
magI += 1;
-
log(magI,magI);
-
magI= magI(Rect(0,0,src_gray.cols,src_gray.rows));
-
-
-
-
-
normalize(magI,magI,0,1,CV_MINMAX);
-
-
-
-
-
-
int cx = magI.cols/2;
-
int cy = magI.rows/2;
-
-
Mat tmp;
-
Mat q0(magI,Rect(0,0,cx,cy));
-
Mat q1(magI,Rect(cx,0,cx,cy));
-
Mat q2(magI,Rect(0,cy,cx,cy));
-
Mat q3(magI,Rect(cx,cy,cx,cy));
-
-
-
q0.copyTo(tmp);
-
q3.copyTo(q0);
-
tmp.copyTo(q3);
-
-
q1.copyTo(tmp);
-
q2.copyTo(q1);
-
tmp.copyTo(q2);
-
-
-
-
namedWindow("InputImage");
-
imshow("InputImage",src);
-
-
namedWindow("SpectrumImage");
-
imshow("SpectrumImage",magI);
-
-
waitKey();
-
return0;
-
}</span>
實驗結果:
代碼已上傳至gihub:opencv之離散傅里葉變換
轉載:http://blog.csdn.net/ubunfans/article/details/24787569