Mat imdft(Mat &src/*,Mat &dst1*/)
{
Mat padded;
int opw = getOptimalDFTSize( src.cols );
int oph = getOptimalDFTSize( src.rows );
copyMakeBorder( src, padded, 0, oph-src.rows, 0, opw-src.cols, BORDER_CONSTANT, Scalar::all(0) );
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
Mat complexI;
merge( planes, 2, complexI );
dft( complexI, complexI );//支持图像原地计算,调用opencv的dtf函数进行DFT计算
split( complexI, planes );
magnitude( planes[0], planes[1], planes[0] );
//////////////show dft image
Mat log_img = planes[0];
//imshow("logimg",log_img);
log_img += Scalar::all(1);
cv::log( log_img, log_img );
log_img = log_img(Rect(0, 0, log_img.cols & -2, log_img.rows & -2 ));
//DFT结果
Mat dst;
dst = log_img.clone();
cv::normalize( dst, dst, 0, 1, CV_MINMAX );
//imshow("win1",dst);
//dst = 255.*dst;
Mat dst_2;
dst.copyTo( dst_2 );
int cx = dst_2.cols/2;
int cy = dst_2.rows/2;
Mat q0( dst_2, Rect(0, 0, cx, cy) );
Mat q1( dst_2, Rect(cx, 0, cx, cy) );
Mat q2( dst_2, Rect(0, cy, cx, cy) );
Mat q3( dst_2, Rect(cx, cy, cx, cy) );
Mat temp;
//因为是共用数据的,所以下面的q0,q1,q2,q3的改变也会导致dst_2的改变。
q0.copyTo( temp );
q3.copyTo( q0 );
temp.copyTo( q3 );
q1.copyTo( temp );
q2.copyTo( q1 );
temp.copyTo( q2 );
//imshow("dst_2",dst_2);
return dst_2;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。