Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1.         cv::Mat MalikPerona_quadr(cv::Mat _src, float k)
  2.         {
  3.             cv::Mat dxM ;
  4.             cv::Mat dyM;
  5.             Sobel(_src, dxM, CV_32F, 1, 0, 3);
  6.             Sobel(_src, dyM, CV_32F, 0, 1, 3);
  7.  
  8.             cv::Mat cM = cv::Mat::zeros(cv::Size(_src.cols, _src.rows), CV_32FC1);
  9.             for(int i = 0; i < _src.cols; i++)
  10.                 for(int j = 0; j < _src.rows; j++)
  11.                     cM.at<float>(j,i) = 1.0f / (1.0f + (std::pow(dxM.at<float>(j,i), 2) + std::pow(dyM.at<float>(j,i), 2))/k*k );
  12.             return cM;
  13.         }
  14.  
  15.         cv::Mat MalikPerona_exp(cv::Mat _src, float k)
  16.         {
  17.             cv::Mat dxM ;
  18.             cv::Mat dyM;
  19.             Sobel(_src, dxM, CV_32F, 1, 0, 3);
  20.             Sobel(_src, dyM, CV_32F, 0, 1, 3);
  21.  
  22.             cv::Mat cM = cv::Mat::zeros(cv::Size(_src.cols, _src.rows), CV_32FC1);
  23.             for(int i = 0; i < _src.cols; i++)
  24.                 for(int j = 0; j < _src.rows; j++){
  25.                     cM.at<float>(j,i) = std::exp(-((std::pow(dxM.at<float>(j,i), 2) + std::pow(dyM.at<float>(j,i), 2))/0.05f*0.05f));
  26.                 }
  27.             return cM;
  28.  
  29.         }
  30.  
  31.         cv::Mat AnisotropicDiffusion(cv::Mat _src, int type, float k , float dt, float lambda )
  32.         {
  33.             _src.convertTo(_src, CV_32FC1, 1.0/255.0);
  34.             cv::Mat cM;
  35.             if(type == EXP)
  36.                 cM = MalikPerona_exp(_src, k);
  37.             else if(type == QUADR)
  38.                 cM = MalikPerona_quadr(_src, k);
  39.             else
  40.                 cM = prop(_src, k);
  41.  
  42.             cv::Mat dst = cv::Mat::zeros(cv::Size(_src.cols, _src.rows), CV_32FC1);
  43.  
  44.             for(int i = 1; i < _src.cols - 1; i++)
  45.                 for(int j = 1; j < _src.rows - 1; j++){
  46.  
  47.                     float v = ((cM.at<float>(j,i-1) + cM.at<float>(j,i))*(_src.at<float>(j,i-1) - _src.at<float>(j,i)) +
  48.                                 (cM.at<float>(j,i+1) + cM.at<float>(j,i))*(_src.at<float>(j,i+1) - _src.at<float>(j,i)) +
  49.                                 (cM.at<float>(j-1,i) + cM.at<float>(j,i))*(_src.at<float>(j-1,i) - _src.at<float>(j,i)) +
  50.                                 (cM.at<float>(j+1,i) + cM.at<float>(j,i))*(_src.at<float>(j+1,i) - _src.at<float>(j,i)));
  51.                     dst.at<float>(j,i) = _src.at<float>(j,i) + dt*lambda*v;
  52.                 }
  53.             _src.convertTo(_src, CV_8UC1, 255.0/1.0);
  54.             dst.convertTo(dst, CV_8UC1, 255.0/1.0);
  55.  
  56.             return dst;
  57.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement