Advertisement
visoft

Laborator 5 Semigrupa 2.

Mar 23rd, 2021
676
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <opencv2/opencv.hpp>
  3. #include <vector>
  4. #include <random>
  5.  
  6. using namespace cv;
  7. using namespace std;
  8.  
  9. int main() {
  10.     Mat_<uchar> image;
  11.     image = imread("/home/visoft/temp/OpenCVApplication-VS2019_OCV451_basic/Images/circle_square.bmp",
  12.                    IMREAD_GRAYSCALE);
  13.     imshow("Display Image", image);
  14.     int label = 0;
  15.     Mat_<int> labels(image.rows, image.cols);
  16.     labels = 0;
  17.     vector<vector<int>> edges;
  18.     edges.push_back({});
  19.  
  20.     int di[] = {0, -1, -1, -1};
  21.     int dj[] = {-1, -1, 0, 1};
  22. #define NR_VEC 4
  23.     int i, j, k;
  24.     for (i = 0; i < image.rows; i++)  // RANDURI
  25.         for (j = 0; j < image.cols; j++) { // COLOANE
  26.             if ((image(i, j) == 0) && (labels(i, j) == 0)) {
  27. //                printf("gasit %d %d\n", i, j);
  28.                 vector<int> L;
  29.                 for (k = 0; k < NR_VEC; k++) {
  30.                     int vi = i + di[k];
  31.                     int vj = j + dj[k];
  32.                     if ((0 <= vi) && (vi < image.rows) && (0 <= vj) && (vj < image.cols)) {
  33.                         int label_vecin = labels(vi, vj);
  34.                         if (label_vecin > 0) {
  35.                             L.push_back(label_vecin);
  36.                         }
  37.                     }
  38.                 }//for all neighbors
  39.                 if (L.size() == 0) {
  40.                     label++;
  41.                     edges.push_back(vector<int>());
  42.                     labels(i, j) = label;
  43.                 } else {
  44.                     int x = L[0];
  45.                     for (k = 1; k < L.size(); k++) {
  46.                         x = min(x, L[k]);
  47.                     }
  48.                     labels(i, j) = x;
  49.                     for (k = 0; k < L.size(); k++) {
  50.                         int y = L[k];
  51.                         if (y != x) {
  52.                             edges[x].push_back(y);
  53.                             edges[y].push_back(x);
  54.                         }
  55.                     }
  56.                 }//end else
  57.  
  58.             }//end if pixel obiect.
  59.         }//end for all pixels
  60.  
  61.     int newlabel = 0;
  62.     vector<int> newlabels(label + 1, 0);
  63.     for (i = 1; i < label; i++) {
  64.         if (newlabels[i] == 0) {
  65.             newlabel++;
  66.             queue<int> Q;
  67.             newlabels[i] = newlabel;
  68.             Q.push(i);
  69.             while (Q.size() > 0) {
  70.                 int x = Q.front();
  71.                 Q.pop();
  72.                 for (k = 0; k < edges[x].size(); k++) {
  73.                     int y = edges[x][k];
  74.                     if (newlabels[y] == 0){
  75.                         newlabels[y] = newlabel;
  76.                         Q.push(y);
  77.                     }
  78.                 }
  79.             }
  80.         }
  81.     }
  82.  
  83.     default_random_engine gen;
  84.     uniform_int_distribution<int> d(0, 255);
  85.  
  86. #define NR_MAX_CULORI 300
  87.     vector<Vec3b> culori(NR_MAX_CULORI);
  88.     culori[0] = Vec3b(255, 255, 255);
  89.     for (i = 1; i < NR_MAX_CULORI; i++) {
  90.         culori[i][0] = d(gen);
  91.         culori[i][1] = d(gen);
  92.         culori[i][2] = d(gen);
  93.     }
  94.  
  95.     Mat_<Vec3b> labels_for_show(image.rows, image.cols);
  96.     for (i = 0; i < image.rows; i++)  // RANDURI
  97.         for (j = 0; j < image.cols; j++) { // COLOANE
  98.             labels_for_show(i, j) = culori[newlabels[labels(i, j)]];
  99.         }
  100.     namedWindow("etichete", WINDOW_NORMAL | WINDOW_GUI_EXPANDED);
  101.     imshow("etichete", labels_for_show);
  102.     waitKey(0);
  103.     return 0;
  104. }
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement