Advertisement
visoft

Laborator 5 clase de echivalenta.

Mar 22nd, 2021
646
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 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.     Mat_<int> labels(image.rows, image.cols);
  14.     labels = 0;
  15.     int crt_label = 0;
  16.     int d_col[] = {0,  -1, -1, -1};
  17.     int d_row[] = {-1, -1,  0,  1};
  18.  
  19.     vector<vector<int>> edges;
  20.     edges.push_back({});
  21.  
  22.     for(int j=0; j < image.cols; j++){ // pe orizontala (coloane)
  23.         for(int i=0; i < image.rows; i++){ // pe verticala (randul)
  24.             if ((image(i, j) == 0) && (labels(i, j) == 0)){
  25.                 vector<int> L;
  26.                 for (int v=0;v<4;v++) {
  27.                     int vec_i = i + d_row[v];
  28.                     int vec_j = j + d_col[v];
  29.                     if ((0 <= vec_i) && (vec_i < image.rows) && (0 <= vec_j) && (vec_j < image.cols)) {
  30.                         if (labels(vec_i, vec_j) > 0) {
  31.                             L.push_back(labels(vec_i, vec_j));
  32.                         }
  33.                     }// end if in imagine
  34.                 }// end for vecini
  35.                 if (L.size() == 0){
  36.                     // NU am gasit vecini
  37.                     crt_label++;
  38.                     labels(i, j) = crt_label;
  39.                     edges.push_back({});
  40.                 }else{
  41.                     int x = L[0];
  42.                     for (int v = 0; v < L.size(); v++){
  43.                         x = min(x, L[v]);
  44.                     }
  45.                     labels(i, j) = x;
  46.                     for (int v = 0 ; v < L.size(); v++){
  47.                         int y = L[v];
  48.                         if (y != x){
  49.                             edges[x].push_back(y);
  50.                             edges[y].push_back(x);
  51.                         }
  52.                     }
  53.                 };
  54.             } //end if pixel obiect
  55.         }
  56.     }
  57.  
  58.     int newlabel = 0;
  59.     vector<int> newlabels(crt_label + 1);
  60.     for (int i = 1; i < crt_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;
  68.                 x = Q.front(); Q.pop();
  69.                 for (int v=0; v < edges[x].size();v++){
  70.                     int y = edges[x][v];
  71.                     if (newlabels[y] == 0){
  72.                         newlabels[y] = newlabel;
  73.                         Q.push(y);
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.     }
  79.  
  80.  
  81.     Mat_<Vec3b> lab_rgb(image.rows, image.cols);
  82.  
  83.     int NR_MAX_CULORI = 500;
  84.     default_random_engine gen;
  85.     uniform_int_distribution<int> d(0,255);
  86.  
  87.     vector<Vec3b> paleta(NR_MAX_CULORI);
  88.     paleta[0] = Vec3b(255, 255, 255);
  89.     for (int v = 1; v < NR_MAX_CULORI; v++){
  90.         paleta[v][0] =d(gen);
  91.         paleta[v][1] =d(gen);
  92.         paleta[v][2] =d(gen);
  93.     }
  94.  
  95.  
  96.     for (int i=0;i<image.rows;i++)
  97.         for (int j=0;j<image.cols;j++){
  98.             int index_paleta = labels(i,j) % NR_MAX_CULORI;
  99.             int clasa_echival = newlabels[index_paleta];
  100.             lab_rgb(i,j) = paleta[clasa_echival];
  101.         }
  102.     imshow("etichete", lab_rgb);
  103.  
  104.     waitKey(0);
  105.     return 0;
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement