SHARE
TWEET

Untitled

a guest May 20th, 2019 55 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void metodaCanny(Mat src, int w) {
  2.  
  3.     imshow("Original", src);
  4.     waitKey(0);
  5.  
  6.     int Sx[3][3] =
  7.     { { -1, 0, 1 },
  8.     { -2, 0, 2 },
  9.     { -1, 0, 1 }, };
  10.     int Sy[3][3] =
  11.     { { 1, 2, 1 },
  12.     { 0, 0, 0 },
  13.     { -1, -2, -1 }, };
  14.     int k = w / 2;
  15.     Mat temp = src.clone(); //matrice temporara
  16.     Mat modul = src.clone(); //matricea pt. modulul gradientului
  17.     Mat directie = src.clone(); //matricea pt. directia gradientului
  18.     float gradX = 0;
  19.     float gradY = 0;
  20.     temp = filtruGaussian2(src, w);
  21.  
  22.     //GaussianBlur(src, temp, Size(5, 5), 0.8, 0.8);
  23.  
  24.     k = 1;
  25.     for (int y = k; y < src.rows - k; y++)
  26.         for (int x = k; x < src.cols - k; x++)
  27.         {
  28.             int auxX = 0;
  29.             int auxY = 0;
  30.             for (int i = -k; i <= k; i++)
  31.                 for (int j = -k; j <= k; j++)
  32.                 {
  33.                     auxX += temp.at<uchar>(y + i, x + j)*Sx[i + k][j + k];
  34.                     auxY += temp.at<uchar>(y + i, x + j)*Sy[i + k][j + k];
  35.                 }
  36.             gradX = auxX;
  37.             gradY = auxY;
  38.  
  39.             int dir = 0;
  40.  
  41.             modul.at<uchar>(y, x) = sqrt(gradX*gradX + gradY*gradY) / 5.65;
  42.  
  43.             float teta = atan2((float)gradY, (float)gradX);
  44.             if ((teta > 3 * PI / 8 && teta < 5 * PI / 8) || (teta > -5 * PI / 8 && teta < -3 * PI / 8))
  45.                 dir = 0;
  46.             if ((teta >   PI / 8 && teta < 3 * PI / 8) || (teta > -7 * PI / 8 || teta < -5 * PI / 8))
  47.                 dir = 1;
  48.             if ((teta >  -PI / 8 && teta <   PI / 8) || (teta > 7 * PI / 8 && teta < -7 * PI / 8))
  49.                 dir = 2;
  50.             if ((teta > 5 * PI / 8 && teta < 7 * PI / 8) || (teta > -3 * PI / 8 && teta <   -PI / 8))
  51.                 dir = 3;
  52.             directie.at<uchar>(y, x) = dir;
  53.         }
  54.  
  55.     imshow("Modul raw", modul);
  56.     waitKey(0);
  57.  
  58.     for (int i = 0; i < modul.rows; i++) {
  59.         for (int j = 0; j < modul.cols; j++) {
  60.             if (directie.at<uchar>(i, j) == 0) {
  61.                 if ((modul.at<uchar>(i, j) < modul.at<uchar>(i - 1, j)) || (modul.at<uchar>(i, j) < modul.at<uchar>(i + 1, j)))
  62.                     modul.at<uchar>(i, j) = 0;
  63.             }
  64.  
  65.             if (directie.at<uchar>(i, j) == 1) {
  66.                 if ((modul.at<uchar>(i, j) < modul.at<uchar>(i - 1, j + 1)) || (modul.at<uchar>(i, j) < modul.at<uchar>(i + 1, j - 1)))
  67.                     modul.at<uchar>(i, j) = 0;
  68.             }
  69.  
  70.             if (directie.at<uchar>(i, j) == 2) {
  71.                 if ((modul.at<uchar>(i, j) < modul.at<uchar>(i, j - 1)) || (modul.at<uchar>(i, j) < modul.at<uchar>(i, j + 1)))
  72.                     modul.at<uchar>(i, j) = 0;
  73.             }
  74.  
  75.             if (directie.at<uchar>(i, j) == 3) {
  76.                 if ((modul.at<uchar>(i, j) < modul.at<uchar>(i - 1, j - 1)) || (modul.at<uchar>(i, j) < modul.at<uchar>(i + 1, j + 1)))
  77.                     modul.at<uchar>(i, j) = 0;
  78.             }
  79.  
  80.  
  81.         }
  82.     }
  83.  
  84.     imshow("Modul NMS", modul);
  85.     waitKey(0);
  86.  
  87.     //compute histogram
  88.     int hist[256] = { 0 };
  89.     for (int i = 1; i < modul.rows - 1; i++) {
  90.         for (int j = 1; j < modul.cols - 1; j++) {
  91.             hist[modul.at<uchar>(i, j)]++;
  92.         }
  93.     }
  94.  
  95.     pdf = new float[256];
  96.     for (int i = 0; i < 256; i++) {
  97.         pdf[i] = hist[i] * 1.0 / (modul.rows*modul.cols);
  98.     }
  99.  
  100.     showHistogram("Histograma", hist, 256, 300);
  101.     waitKey(0);
  102.  
  103.     float p = 0.1;
  104.     float K = 0.4;
  105.     int nrPixCuGrNul = 0;
  106.     /*for (int i = 1; i < modul.rows - 1; i++)
  107.     for (int j = 1; j < modul.cols - 1; j++)
  108.     {
  109.     if (modul.at<uchar>(i, j) == 0) nrPixCuGrNul += 1;
  110.     }
  111.  
  112.     //int nrPctMuchie = p*(modul.rows*modul.cols - nrPixCuGrNul);*/
  113.     float nrNonMuchie = (1 - p)*(modul.rows*modul.cols - hist[0]);
  114.  
  115.     float sum = 0, prag = 0; int i;
  116.     for (i = 1; i < 256; i++) {
  117.         sum += hist[i];
  118.         if (sum > nrNonMuchie) {
  119.             prag = i;
  120.             break;
  121.         }
  122.     }
  123.     printf("prag %2f", prag);
  124.     float pragInalt = prag;
  125.     float pragCoborat = K*pragInalt;
  126.  
  127.     for (int i = 1; i < modul.rows - 1; i++)
  128.         for (int j = 1; j < modul.cols - 1; j++)
  129.         {
  130.             if (modul.at<uchar>(i, j) < pragCoborat) {
  131.                 modul.at<uchar>(i, j) = 0;
  132.             }
  133.             else if (modul.at<uchar>(i, j) > pragInalt) {
  134.                 modul.at<uchar>(i, j) = STRONG;
  135.             }
  136.             else if ((pragCoborat < modul.at<uchar>(i, j)) && (modul.at<uchar>(i, j) < pragInalt)) {
  137.                 modul.at<uchar>(i, j) = WEAK;
  138.             }
  139.         }
  140.  
  141.     imshow("ModulWEAK/STRONG", modul);
  142.     waitKey(0);
  143.  
  144.     queue <Point> que;
  145.     //int visited[256][256] = { 0 };
  146.     Mat visited = src.clone().setTo(0);
  147.  
  148.     for (int i = 1; i < modul.rows - 1; i++)
  149.         for (int j = 1; j < modul.cols - 1; j++) {
  150.             if ((modul.at<uchar>(i, j) == STRONG) && (visited.at<uchar>(i, j) == 0)) {
  151.                 que.push(Point(j, i));
  152.  
  153.                 while (!que.empty()) {
  154.                     Point oldest = que.front();
  155.                     que.pop();
  156.                     int jj = oldest.x;
  157.                     int ii = oldest.y;
  158.                     visited.at<uchar>(ii, jj) = 1;
  159.  
  160.                     for (int i = MAX(ii - 1, 0); i <= MIN(ii + 1, modul.rows); i++)
  161.                         for (int j = MAX(jj - 1, 0); j <= MIN(jj + 1, modul.cols); j++)
  162.                         {
  163.                             if (modul.at<uchar>(i, j) == WEAK)
  164.                             {
  165.                                 modul.at<uchar>(i, j) = STRONG;
  166.                                 que.push(Point(j, i));
  167.                             }
  168.                         }
  169.                 }
  170.  
  171.             }
  172.  
  173.             for (int i = 1; i < modul.rows - 1; i++) {
  174.                 for (int j = 1; j < modul.cols - 1; j++) {
  175.                     if (modul.at<uchar>(i, j) == WEAK) { modul.at<uchar>(i, j) = 0; }
  176.                 }
  177.             }
  178.         }
  179.  
  180.  
  181.     imshow("Final", modul);
  182.     waitKey(0);
  183.  
  184. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top