函数解读:
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