Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void metodaCanny(Mat src, int w) {
- imshow("Original", src);
- waitKey(0);
- int Sx[3][3] =
- { { -1, 0, 1 },
- { -2, 0, 2 },
- { -1, 0, 1 }, };
- int Sy[3][3] =
- { { 1, 2, 1 },
- { 0, 0, 0 },
- { -1, -2, -1 }, };
- int k = w / 2;
- Mat temp = src.clone(); //matrice temporara
- Mat modul = src.clone(); //matricea pt. modulul gradientului
- Mat directie = src.clone(); //matricea pt. directia gradientului
- float gradX = 0;
- float gradY = 0;
- temp = filtruGaussian2(src, w);
- //GaussianBlur(src, temp, Size(5, 5), 0.8, 0.8);
- k = 1;
- for (int y = k; y < src.rows - k; y++)
- for (int x = k; x < src.cols - k; x++)
- {
- int auxX = 0;
- int auxY = 0;
- for (int i = -k; i <= k; i++)
- for (int j = -k; j <= k; j++)
- {
- auxX += temp.at<uchar>(y + i, x + j)*Sx[i + k][j + k];
- auxY += temp.at<uchar>(y + i, x + j)*Sy[i + k][j + k];
- }
- gradX = auxX;
- gradY = auxY;
- int dir = 0;
- modul.at<uchar>(y, x) = sqrt(gradX*gradX + gradY*gradY) / 5.65;
- float teta = atan2((float)gradY, (float)gradX);
- if ((teta > 3 * PI / 8 && teta < 5 * PI / 8) || (teta > -5 * PI / 8 && teta < -3 * PI / 8))
- dir = 0;
- if ((teta > PI / 8 && teta < 3 * PI / 8) || (teta > -7 * PI / 8 || teta < -5 * PI / 8))
- dir = 1;
- if ((teta > -PI / 8 && teta < PI / 8) || (teta > 7 * PI / 8 && teta < -7 * PI / 8))
- dir = 2;
- if ((teta > 5 * PI / 8 && teta < 7 * PI / 8) || (teta > -3 * PI / 8 && teta < -PI / 8))
- dir = 3;
- directie.at<uchar>(y, x) = dir;
- }
- imshow("Modul raw", modul);
- waitKey(0);
- for (int i = 0; i < modul.rows; i++) {
- for (int j = 0; j < modul.cols; j++) {
- if (directie.at<uchar>(i, j) == 0) {
- if ((modul.at<uchar>(i, j) < modul.at<uchar>(i - 1, j)) || (modul.at<uchar>(i, j) < modul.at<uchar>(i + 1, j)))
- modul.at<uchar>(i, j) = 0;
- }
- if (directie.at<uchar>(i, j) == 1) {
- 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)))
- modul.at<uchar>(i, j) = 0;
- }
- if (directie.at<uchar>(i, j) == 2) {
- if ((modul.at<uchar>(i, j) < modul.at<uchar>(i, j - 1)) || (modul.at<uchar>(i, j) < modul.at<uchar>(i, j + 1)))
- modul.at<uchar>(i, j) = 0;
- }
- if (directie.at<uchar>(i, j) == 3) {
- 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)))
- modul.at<uchar>(i, j) = 0;
- }
- }
- }
- imshow("Modul NMS", modul);
- waitKey(0);
- //compute histogram
- int hist[256] = { 0 };
- for (int i = 1; i < modul.rows - 1; i++) {
- for (int j = 1; j < modul.cols - 1; j++) {
- hist[modul.at<uchar>(i, j)]++;
- }
- }
- pdf = new float[256];
- for (int i = 0; i < 256; i++) {
- pdf[i] = hist[i] * 1.0 / (modul.rows*modul.cols);
- }
- showHistogram("Histograma", hist, 256, 300);
- waitKey(0);
- float p = 0.1;
- float K = 0.4;
- int nrPixCuGrNul = 0;
- /*for (int i = 1; i < modul.rows - 1; i++)
- for (int j = 1; j < modul.cols - 1; j++)
- {
- if (modul.at<uchar>(i, j) == 0) nrPixCuGrNul += 1;
- }
- //int nrPctMuchie = p*(modul.rows*modul.cols - nrPixCuGrNul);*/
- float nrNonMuchie = (1 - p)*(modul.rows*modul.cols - hist[0]);
- float sum = 0, prag = 0; int i;
- for (i = 1; i < 256; i++) {
- sum += hist[i];
- if (sum > nrNonMuchie) {
- prag = i;
- break;
- }
- }
- printf("prag %2f", prag);
- float pragInalt = prag;
- float pragCoborat = K*pragInalt;
- for (int i = 1; i < modul.rows - 1; i++)
- for (int j = 1; j < modul.cols - 1; j++)
- {
- if (modul.at<uchar>(i, j) < pragCoborat) {
- modul.at<uchar>(i, j) = 0;
- }
- else if (modul.at<uchar>(i, j) > pragInalt) {
- modul.at<uchar>(i, j) = STRONG;
- }
- else if ((pragCoborat < modul.at<uchar>(i, j)) && (modul.at<uchar>(i, j) < pragInalt)) {
- modul.at<uchar>(i, j) = WEAK;
- }
- }
- imshow("ModulWEAK/STRONG", modul);
- waitKey(0);
- queue <Point> que;
- //int visited[256][256] = { 0 };
- Mat visited = src.clone().setTo(0);
- for (int i = 1; i < modul.rows - 1; i++)
- for (int j = 1; j < modul.cols - 1; j++) {
- if ((modul.at<uchar>(i, j) == STRONG) && (visited.at<uchar>(i, j) == 0)) {
- que.push(Point(j, i));
- while (!que.empty()) {
- Point oldest = que.front();
- que.pop();
- int jj = oldest.x;
- int ii = oldest.y;
- visited.at<uchar>(ii, jj) = 1;
- for (int i = MAX(ii - 1, 0); i <= MIN(ii + 1, modul.rows); i++)
- for (int j = MAX(jj - 1, 0); j <= MIN(jj + 1, modul.cols); j++)
- {
- if (modul.at<uchar>(i, j) == WEAK)
- {
- modul.at<uchar>(i, j) = STRONG;
- que.push(Point(j, i));
- }
- }
- }
- }
- for (int i = 1; i < modul.rows - 1; i++) {
- for (int j = 1; j < modul.cols - 1; j++) {
- if (modul.at<uchar>(i, j) == WEAK) { modul.at<uchar>(i, j) = 0; }
- }
- }
- }
- imshow("Final", modul);
- waitKey(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement