Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.62 KB | None | 0 0
  1. enum Filter{lowpass, highpass, notch, bandpass, lpn, hpbp};
  2.  
  3. void utilities::swapQuads(cv::Mat &img) {
  4.     // Rearranges amplitude image
  5.     int cx = img.cols / 2;
  6.     int cy = img.rows / 2;
  7.     cv::Mat q0(img, cv::Rect(0, 0, cx, cy));   // Top-Left - Create a ROI per quadrant
  8.     cv::Mat q1(img, cv::Rect(cx, 0, cx, cy));  // Top-Right
  9.     cv::Mat q2(img, cv::Rect(0, cy, cx, cy));  // Bottom-Left
  10.     cv::Mat q3(img, cv::Rect(cx, cy, cx, cy)); // Bottom-Right
  11.    
  12.     // swap quadrants (Top-Left with Bottom-Right)
  13.     cv::Mat tmp;                          
  14.     q0.copyTo(tmp);
  15.     q3.copyTo(q0);
  16.     tmp.copyTo(q3);
  17.    
  18.     // swap quadrant (Top-Right with Bottom-Left)
  19.     q1.copyTo(tmp);                    
  20.     q2.copyTo(q1);
  21.     tmp.copyTo(q2);
  22. }
  23.  
  24. cv::Mat utilities::create_mask(Filter filter, int rows, int cols, int d0, int d1, int d2){
  25.     cv::Mat mask(rows, cols, CV_32FC2);
  26.     int cx = cols / 2, cy = rows / 2, di;
  27.     for(int i = 0; i < rows; i++){
  28.         for(int j = 0; j < cols; j++){
  29.             di = sqrt(pow(i-cy, 2) + pow(j-cx, 2));
  30.             switch(filter){
  31.                 case lowpass :
  32.                     if(di <= d0){
  33.                         mask.at<cv::Vec2f>(i, j)[0] = 1;
  34.                         mask.at<cv::Vec2f>(i, j)[1] = 1;
  35.                     }
  36.                     else{
  37.                         mask.at<cv::Vec2f>(i, j)[0] = 0;
  38.                         mask.at<cv::Vec2f>(i, j)[1] = 0;
  39.                     }
  40.                     break;
  41.  
  42.                 case highpass:
  43.                     if(di >= d0){
  44.                         mask.at<cv::Vec2f>(i, j)[0] = 1;
  45.                         mask.at<cv::Vec2f>(i, j)[1] = 1;
  46.                     }
  47.                     else{
  48.                         mask.at<cv::Vec2f>(i, j)[0] = 0;
  49.                         mask.at<cv::Vec2f>(i, j)[1] = 0;
  50.                     }
  51.                     break;
  52.  
  53.                 case notch:
  54.                     if(di <= d1 || di >= d2){
  55.                         mask.at<cv::Vec2f>(i, j)[0] = 1;
  56.                         mask.at<cv::Vec2f>(i, j)[1] = 1;
  57.                     }
  58.                     else{
  59.                         mask.at<cv::Vec2f>(i, j)[0] = 0;
  60.                         mask.at<cv::Vec2f>(i, j)[1] = 0;
  61.                     }
  62.                     break;
  63.  
  64.                 case bandpass:
  65.                     if(di >= d1 && di <= d2){
  66.                         mask.at<cv::Vec2f>(i, j)[0] = 1;
  67.                         mask.at<cv::Vec2f>(i, j)[1] = 1;
  68.                     }
  69.                     else{
  70.                         mask.at<cv::Vec2f>(i, j)[0] = 0;
  71.                         mask.at<cv::Vec2f>(i, j)[1] = 0;
  72.                     }
  73.                     break;
  74.  
  75.                 case lpn:
  76.                     if(di <= d0 || (di >= d1 && di <= d2)){
  77.                         mask.at<cv::Vec2f>(i, j)[0] = 1;
  78.                         mask.at<cv::Vec2f>(i, j)[1] = 1;
  79.                     }
  80.                     else{
  81.                         mask.at<cv::Vec2f>(i, j)[0] = 0;
  82.                         mask.at<cv::Vec2f>(i, j)[1] = 0;
  83.                     }
  84.                     break;
  85.  
  86.                 case hpbp:
  87.                     if(di >= d0 && (di <= d1 || di >= d2)){
  88.                         mask.at<cv::Vec2f>(i, j)[0] = 1;
  89.                         mask.at<cv::Vec2f>(i, j)[1] = 1;
  90.                     }
  91.                     else{
  92.                         mask.at<cv::Vec2f>(i, j)[0] = 0;
  93.                         mask.at<cv::Vec2f>(i, j)[1] = 0;
  94.                     }
  95.                     break;
  96.  
  97.                 default : break;
  98.             }
  99.                    
  100.         }
  101.     }
  102.  
  103.     return mask;
  104. }
  105.  
  106. void utilities::cvidft(cv::Mat &tgt, cv::Mat &magI, cv::Mat &complexI){
  107.     // Creates fourier domain amplitude image
  108.     double minv, maxv;
  109.     cv::minMaxLoc(tgt, &minv, &maxv);
  110.     cv::Mat planes[2];
  111.     cv::split(complexI, planes);
  112.     cv::magnitude(planes[0], planes[1], magI);
  113.     magI += cv::Scalar::all(1);
  114.     cv::log(magI, magI);
  115.     cv::normalize(magI, magI, minv, maxv, CV_MINMAX);
  116.  
  117.     // Converts back to image, crops padding, and saves roi to target
  118.     utilities::swapQuads(complexI);
  119.     cv::idft(complexI, complexI, cv::DFT_SCALE | cv::DFT_REAL_OUTPUT);
  120.     cv::normalize(complexI, complexI, 0, 255, CV_MINMAX);
  121.     complexI.convertTo(complexI, CV_8U);
  122.     complexI = complexI(cv::Rect(0, 0, tgt.cols, tgt.rows));
  123.     complexI.copyTo(tgt);
  124. }
  125.  
  126. void utilities::cvdft(cv::Mat &src, cv::Mat &magI, cv::Mat &complexI){
  127.     // Gets min/max
  128.     double minv, maxv;
  129.     cv::minMaxLoc(src, &minv, &maxv);
  130.  
  131.     // Pads image if needed
  132.     cv::Mat padded;
  133.     int m = cv::getOptimalDFTSize(src.rows);
  134.     int n = cv::getOptimalDFTSize(src.cols);
  135.     cv::copyMakeBorder(src, padded, 0, m - src.rows, 0, n - src.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));
  136.  
  137.     // Create planes and run dft
  138.     cv::Mat planes[] = {cv::Mat_<float>(padded), cv::Mat::zeros(padded.size(), CV_32F)};
  139.     cv::merge(planes, 2, complexI);
  140.     cv::dft(complexI, complexI);
  141.  
  142.     // Swaps quadrants
  143.     utilities::swapQuads(complexI);
  144.  
  145.     // Creates fourier domain amplitude image
  146.     cv::split(complexI, planes);
  147.     cv::magnitude(planes[0], planes[1], magI);
  148.     magI += cv::Scalar::all(1);
  149.     cv::log(magI, magI);
  150.     cv::normalize(magI, magI, minv, maxv, CV_MINMAX);
  151. }
  152.  
  153. void utilities::dft_filter(cv::Mat &tgt, cv::Mat &magbefore, cv::Mat &magafter, int d0, int d1, int d2, Filter filter){
  154.     // Runs dft on src
  155.     cv::Mat complexI;
  156.     utilities::cvdft(tgt, magbefore, complexI);
  157.  
  158.     // Runs low pass filter mask
  159.     cv::Mat mask = utilities::create_mask(filter, complexI.rows, complexI.cols, d0, d1, d2);
  160.  
  161.     // Applies mask to complexI
  162.     cv::multiply(complexI, mask, complexI);
  163.  
  164.     // Inverse DFT
  165.     utilities::cvidft(tgt, magafter, complexI);
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement