Advertisement
visoft

Laborator 5 Grupa 1 semigrupa 1

Mar 23rd, 2021
744
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 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/letters.bmp", IMREAD_GRAYSCALE);
  12.     imshow("Display Image", image);
  13.     int label = 0;
  14.     Mat_<int> labels(image.rows, image.cols);
  15.     labels = 0;
  16.     vector<vector<int>> edges;
  17.     edges.push_back(vector<int>());
  18.  
  19.     int di[] = {0, -1, -1, -1};
  20.     int dj[] = {-1, -1, 0, 1};
  21.  
  22.     for (int i = 0; i < image.rows; i++)   // RADNDURI
  23.         for (int j = 0; j < image.cols; j++) {  //  COLOANE
  24.             if ((image(i, j) == 0) && (labels(i, j) == 0)) {
  25. //                printf("gasit %d %d\n", i, j);
  26.                 vector<int> L;
  27.                 for (int k = 0; k < 4; k++) {
  28.                     int iv = i + di[k];
  29.                     int jv = j + dj[k];
  30.                     if ((0 <= iv) && (iv < image.rows) && (0 <= jv) && (jv <= image.cols)) {
  31.                         if (labels(iv, jv) > 0) {
  32.                             L.push_back(labels(iv, jv));
  33.                         }
  34.                     }//if neigbor in the image
  35.                 }//for all neigbors
  36.                 if (L.size() == 0) {
  37.                     label++;
  38.                     edges.push_back(vector<int>());
  39.                     labels(i, j) = label;
  40.                 } else {
  41.                     int x = L[0];
  42.                     for (int k = 1; k < L.size(); k++) {
  43.                         x = min(x, L[k]);
  44.                     }
  45.                     labels(i, j) = x;
  46.                     for (int k = 1; k < L.size(); k++) {
  47.                         int y = L[k];
  48.                         if (y != x) {
  49.                             edges[x].push_back(y);
  50.                             edges[y].push_back(x);
  51.                         }
  52.                     }
  53.                 }
  54.  
  55.             }//if pixel obiect
  56.         }
  57.  
  58.     int newlabel = 0;
  59.     vector<int> newlabels(label + 1, 0);
  60.     for (int i = 1; i < label; i++) {
  61.         if (newlabels[i] == 0) {
  62.             newlabel++;
  63.             queue<int> Q;
  64.             newlabels[i] = newlabel;
  65.             Q.push(i);
  66.             while (Q.size() > 0) {
  67.                 int x = Q.front();
  68.                 Q.pop();
  69.                 for (int k = 0; k < edges[x].size(); k++) {
  70.                     int y = edges[x][k];
  71.                     if (newlabels[y] == 0) {
  72.                         newlabels[y] = newlabel;
  73.                         Q.push(y);
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.     }
  79.  
  80.     default_random_engine gen;
  81.     uniform_int_distribution<int> d(0, 255);
  82.  
  83. #define MAX_CULORI 400
  84.  
  85.     vector<Vec3b> index_culori(MAX_CULORI);
  86.     index_culori[0] = Vec3b(255, 255, 255);
  87.     for (int k = 1; k < MAX_CULORI; k++) {
  88.         index_culori[k][0] = d(gen);
  89.         index_culori[k][1] = d(gen);
  90.         index_culori[k][2] = d(gen);
  91.     }
  92.  
  93.     Mat_<Vec3b> etichete_colorate(image.rows, image.cols);
  94.     for (int i = 0; i < image.rows; i++)
  95.         for (int j = 0; j < image.cols; j++) {
  96.             etichete_colorate(i, j) = index_culori[newlabels[labels(i, j)] % MAX_CULORI];
  97.         }
  98.     imshow("etichete", etichete_colorate);
  99.     waitKey(0);
  100.     return 0;
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement