Advertisement
Guest User

Canny

a guest
May 21st, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.55 KB | None | 0 0
  1. int sx[3][3] = { { -1, 0, 1 },{ -2, 0, 2 },{ -1, 0, 1 } };
  2. int sy[3][3] = { { 1, 2, 1 },{ 0, 0, 0 },{ -1, -2, -1 } };
  3.  
  4. Mat modDir(Mat src, int kernelX[3][3], int kernelY[3][3], int kernelSize, bool print = false)
  5. {
  6.     Mat dst = src.clone();
  7.     int height = src.rows, width = src.cols, range = kernelSize / 2;
  8.  
  9.     for (int i = 1; i < height - 1; i++) {
  10.         for (int j = 1; j < width - 1; j++) {
  11.             double sumPixelX = 0.0f;
  12.             double sumPixelY = 0.0f;
  13.             double total = 0.0f;
  14.  
  15.             for (int k = 0; k < kernelSize; k++) {
  16.                 for (int l = 0; l < kernelSize; l++) {
  17.                     int x = i + k - range, y = j + l - range;
  18.                     if (x >= 0 && x < height && y >= 0 && y < width) {
  19.                         uchar pixel = src.at<uchar>(x, y);
  20.                         sumPixelX += pixel * kernelX[k][l];
  21.                         sumPixelY += pixel * kernelY[k][l];
  22.                     }
  23.                 }
  24.             }
  25.             dst.at<uchar>(i, j) = (uchar)(sqrt((sumPixelX * sumPixelX) + (sumPixelY * sumPixelY)) / (4 * sqrt(2.0)));
  26.  
  27.         }
  28.     }
  29.     if (print) {
  30.         imshow("Imagine original", src);
  31.         imshow("Imagine modul", dst);
  32.         waitKey();
  33.     }
  34.     return dst;
  35. }
  36.  
  37. Mat dirMod(Mat src, int kernelX[3][3], int kernelY[3][3], int kernelSize, bool print = false)
  38. {
  39.     //Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC1);
  40.     Mat dst = src.clone();
  41.     int height = src.rows, width = src.cols, range = kernelSize / 2;
  42.  
  43.     for (int i = 0; i < height; i++) {
  44.         for (int j = 0; j < width; j++) {
  45.             double sumPixelX = 0.0f;
  46.             double sumPixelY = 0.0f;
  47.             double total = 0.0f;
  48.  
  49.             for (int k = 0; k < kernelSize; k++) {
  50.                 for (int l = 0; l < kernelSize; l++) {
  51.                     int x = i + k - range, y = j + l - range;
  52.                     if (x >= 0 && x < height && y >= 0 && y < width) {
  53.                         uchar pixel = src.at<uchar>(x, y);
  54.                         sumPixelX += pixel * kernelX[k][l];
  55.                         sumPixelY += pixel * kernelY[k][l];
  56.                     }
  57.                 }
  58.             }
  59.             float x = atan2((float)sumPixelY, (float)sumPixelX);
  60.             if ((x >= (3 * PI) / 8 && x <= (5 * PI) / 8) || (x >= -(5 * PI) / 8 && x <= -(3 * PI) / 8))
  61.                 dst.at<uchar>(i, j) = 0;
  62.             else if ((x >= (PI) / 8 && x <= (3 * PI) / 8) || (x >= -(7 * PI) / 8 && x <= -(5 * PI) / 8))
  63.                 dst.at<uchar>(i, j) = 1;
  64.             else if ((x >= -(PI) / 8 && x <= (PI) / 8) || (x >= (7 * PI) / 8) || (x <= -(7 * PI) / 8))
  65.                 dst.at<uchar>(i, j) = 2;
  66.             else if ((x >= (5 * PI) / 8 && x <= (7 * PI) / 8) || (x >= -(3 * PI) / 8 && x <= -(PI) / 8))
  67.                 dst.at<uchar>(i, j) = 3;
  68.  
  69.         }
  70.     }
  71.     if (print) {
  72.         imshow("Imagine original", src);
  73.         imshow("Imagine directie", dst);
  74.         waitKey();
  75.     }
  76.     return dst;
  77. }
  78.  
  79.  
  80.  
  81. Mat cannyAlgorithm(Mat src)
  82. {
  83.     int height = src.rows;
  84.     int width = src.cols;
  85.     Mat dst = Mat(height, width, CV_8UC1);
  86.     Mat dst1 = Mat(height, width, CV_8UC1);
  87.     Mat dst2 = Mat(height, width, CV_8UC1);
  88.  
  89.     //pas 1
  90.     //dst = GaussFil(src, 3);
  91.  
  92.     //pas 2
  93.     dst1 = modDir(src, sx, sy, 3);
  94.     dst2 = dirMod(src, sx, sy, 3); // cadranele sunt 100% bune ca am verificat de pe net
  95.     Mat dst3 = dst1.clone();
  96.     Mat dst4 = dst1.clone();
  97.  
  98.     //pas 3 - inca nu e okkkkk!!!
  99.     //i-urile si j-urile de mai jos sunt bune ca le-am verificat
  100.     for (int i = 1; i<height - 1; i++)
  101.     {
  102.         for (int j = 1; j<width - 1; j++)
  103.         {
  104.             if (dst2.at<uchar>(i, j) == 0)
  105.             {
  106.                 if ((dst1.at<uchar>(i, j) < dst1.at<uchar>(i + 1, j)) || (dst1.at<uchar>(i, j) < dst1.at<uchar>(i - 1, j)))
  107.                 {
  108.                     dst3.at<uchar>(i, j) = 0;
  109.                 }
  110.             }
  111.             else if (dst2.at<uchar>(i, j) == 1)
  112.             {
  113.                 if ((dst1.at<uchar>(i, j) < dst1.at<uchar>(i + 1, j - 1)) || (dst1.at<uchar>(i, j) < dst1.at<uchar>(i - 1, j + 1)))
  114.                 {
  115.                     dst3.at<uchar>(i, j) = 0;
  116.                 }
  117.             }
  118.             else if (dst2.at<uchar>(i, j) == 2)
  119.             {
  120.                 if ((dst1.at<uchar>(i, j) < dst1.at<uchar>(i, j - 1)) || (dst1.at<uchar>(i, j) < dst1.at<uchar>(i, j + 1)))
  121.                 {
  122.                     dst3.at<uchar>(i, j) = 0;
  123.                 }
  124.             }
  125.             else if (dst2.at<uchar>(i, j) == 3)
  126.             {
  127.                 if ((dst1.at<uchar>(i, j) < dst1.at<uchar>(i - 1, j - 1)) || (dst1.at<uchar>(i, j) < dst1.at<uchar>(i + 1, j + 1)))
  128.                 {
  129.                     dst3.at<uchar>(i, j) = 0;
  130.                 }
  131.             }
  132.         }
  133.     }
  134.  
  135.     //pas 4
  136.  
  137.     int histo[256];
  138.  
  139.     for (int i = 0; i < 256; i++) {
  140.         histo[i] = 0;
  141.     }
  142.  
  143.     for (int i = 1; i < src.rows - 1; i++)
  144.     {
  145.         for (int j = 1; j < src.cols - 1; j++)
  146.         {
  147.             int index = dst3.at<uchar>(i, j);
  148.             histo[index]++;
  149.         }
  150.     }
  151.  
  152.     //showHistogram("Histograma", histo, 256, 256);
  153.  
  154.     long nrNonMuchie = 0;
  155.     float p = 0.1;       //p are valori intre 0.01 si 0.1, in lab zice ca e 0.1
  156.     float k = 0.4;
  157.  
  158.     nrNonMuchie = (1 - p)*((height - 2)*(width - 2) - histo[0]);
  159.  
  160.     int sum = 0;
  161.     int prag = -1;
  162.     int i = 1;
  163.     while (i < 256 && prag == -1)
  164.     {
  165.         sum += histo[i];
  166.         if (sum > nrNonMuchie)
  167.         {
  168.             prag = i;
  169.         }
  170.         i++;
  171.     }
  172.  
  173.     int pragInalt = prag;
  174.     int pragCoborat = k*prag;
  175.  
  176.     for (int i = 1; i < dst3.rows - 1; i++)
  177.     {
  178.         for (int j = 1; j < dst3.cols - 1; j++)
  179.         {
  180.             if (dst3.at<uchar>(i, j) < pragCoborat)
  181.                 dst4.at<uchar>(i, j) = 0;
  182.             else if (dst3.at<uchar>(i, j) > pragInalt)
  183.                 dst4.at<uchar>(i, j) = 255;
  184.             else
  185.                 dst4.at<uchar>(i, j) = 128;
  186.         }
  187.     }
  188.  
  189.     // pas 5
  190.     int neighb = 8;
  191.     int di[8] = { -1, 0, 1, 0, -1, -1, 1, 1 };
  192.     int dj[8] = { 0, -1, 0, 1, -1, 1, -1, 1 };
  193.     //int di[24] = { -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2 };
  194.     //int dj[24] = { -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 };
  195.     Mat dstExtend = dst4.clone();
  196.     Mat visited = Mat::zeros(dstExtend.rows, dstExtend.cols, CV_8UC1);
  197.     for (int i = 0; i < height; i++) {
  198.         for (int j = 0; j < width; j++) {
  199.             uchar pixel = dst4.at<uchar>(i, j);
  200.             if (pixel == 255) {
  201.                 std::queue<Point2i> Q;
  202.                 Q.push(Point2i(i, j));
  203.                 while (!Q.empty()) {
  204.                     Point2i point = Q.front();  //Luam primul element din coada, fara a-l sterge
  205.                     Q.pop();    //Stergem primul element din coada
  206.                                 //Parcurgem vecinii
  207.                     for (int k = 0; k < neighb; k++) {
  208.                         int x = point.x + di[k],
  209.                             y = point.y + dj[k];
  210.                         if (x > 0 && x < height && y > 0 && y < width) {
  211.                             if (dst4.at<uchar>(x, y) == 128 && visited.at<uchar>(x, y) == 0) {
  212.                                 dstExtend.at<uchar>(x, y) = 255;
  213.                                 visited.at<uchar>(x, y) = 1;
  214.                                 Q.push(Point2i(x, y));  //Adaugam vecinii in coada
  215.                                                         //printf("Added to queue\n");
  216.                             }
  217.                         }
  218.                     }
  219.                 }
  220.             }
  221.         }
  222.     }
  223.     //Parcurgere pentru eliminarea muchiilor slabe ramase
  224.     for (int i = 0; i < height; i++) {
  225.         for (int j = 0; j < width; j++) {
  226.             uchar pixel = dstExtend.at<uchar>(i, j);
  227.             if (pixel == 128)
  228.                 dstExtend.at<uchar>(i, j) = 0;
  229.         }
  230.     }
  231.  
  232.  
  233.     /*imshow("Imagine originala", src);
  234.     imshow("Imagine Canny maxime", dst3);
  235.     imshow("Imagine Canny binarizare", dst4);
  236.     imshow("Canny final", dstExtend);
  237.     waitKey();*/
  238.     return dstExtend;
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement