Advertisement
Guest User

Untitled

a guest
May 20th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.83 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement