Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. Mat myDFT(const Mat & src)
  2. {
  3.     Mat result(src.size(), CV_32FC2, Scalar::all(0));
  4.     //calc DFT for each row
  5.     vector<vector<complex<double>>> fourierImageForRows;
  6.     for (int row = 0; row < src.rows; row++)
  7.     {
  8.  
  9.         vector<complex<double>> rowFourier;
  10.         for (int u = 0; u < src.cols; u++)//u - частотная переменная
  11.         {
  12.             double coeff = -2 * PI * u / src.cols;
  13.             double a = cos(coeff);
  14.             double b = sin(coeff);
  15.  
  16.             complex<double> W(a, b);
  17.             complex<double> W_0(a, b);
  18.  
  19.             double real = src.at<float>(row, 0);
  20.             double imag = 0;
  21.  
  22.             for (int n = 1; n < src.cols; n++)
  23.             {
  24.                 double magn = src.at<float>(row, n);
  25.  
  26.                 real += magn * W.real();
  27.                 imag += magn * W.imag();
  28.                 W *= W_0;//ЗАЧЕМ
  29.             }
  30.             complex<double>res(real, -imag);
  31.             rowFourier.emplace_back(res);
  32.         }
  33.         fourierImageForRows.emplace_back(rowFourier);
  34.     }
  35.  
  36.     //calc DFT for cols
  37.     vector<vector<complex<double>>> resultFourier;
  38.     for (int col = 0; col < src.cols; col++)
  39.     {
  40.         vector<complex<double>> rowFourier;
  41.         for (int w = 0; w < src.rows; w++)
  42.         {
  43.             double coeff = -2 * PI * w / src.rows;
  44.             double a = cos(coeff);
  45.             double b = sin(coeff);
  46.             complex<double> W(a, b);
  47.             complex<double> W_0(a, b);
  48.  
  49.             double real = fourierImageForRows[0][col].real() * 1;
  50.             double imag = -fourierImageForRows[0][col].imag();
  51.  
  52.             for (int n = 1; n < src.rows; n++)
  53.             {
  54.                 complex<double> value = fourierImageForRows[n][col];
  55.                 complex<double> res = W * conj(value);
  56.  
  57.                 real += res.real();
  58.                 imag += res.imag();
  59.  
  60.                 W *= W_0;
  61.             }
  62.             complex<double>res(real, imag);
  63.             rowFourier.emplace_back(res);
  64.             result.at<Vec2f>(w, col) = Vec2f(real, imag);
  65.         }
  66.     }
  67.  
  68.     return result;//получаем изображение в частотном представлении
  69.  
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement