Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <opencv2/opencv.hpp>
- #include <vector>
- #include <random>
- using namespace cv;
- using namespace std;
- int main() {
- Mat_<uchar> image;
- image = imread( "/home/visoft/temp/OpenCVApplication-VS2019_OCV451_basic/Images/letters.bmp", IMREAD_GRAYSCALE);
- imshow("Display Image", image);
- Mat_<int> labels(image.rows, image.cols);
- labels = 0;
- int crt_label = 0;
- int d_col[] = {0, -1, -1, -1};
- int d_row[] = {-1, -1, 0, 1};
- vector<vector<int>> edges;
- edges.push_back({});
- for(int j=0; j < image.cols; j++){ // pe orizontala (coloane)
- for(int i=0; i < image.rows; i++){ // pe verticala (randul)
- if ((image(i, j) == 0) && (labels(i, j) == 0)){
- vector<int> L;
- for (int v=0;v<4;v++) {
- int vec_i = i + d_row[v];
- int vec_j = j + d_col[v];
- if ((0 <= vec_i) && (vec_i < image.rows) && (0 <= vec_j) && (vec_j < image.cols)) {
- if (labels(vec_i, vec_j) > 0) {
- L.push_back(labels(vec_i, vec_j));
- }
- }// end if in imagine
- }// end for vecini
- if (L.size() == 0){
- // NU am gasit vecini
- crt_label++;
- labels(i, j) = crt_label;
- edges.push_back({});
- }else{
- int x = L[0];
- for (int v = 0; v < L.size(); v++){
- x = min(x, L[v]);
- }
- labels(i, j) = x;
- for (int v = 0 ; v < L.size(); v++){
- int y = L[v];
- if (y != x){
- edges[x].push_back(y);
- edges[y].push_back(x);
- }
- }
- };
- } //end if pixel obiect
- }
- }
- int newlabel = 0;
- vector<int> newlabels(crt_label + 1);
- for (int i = 1; i < crt_label; i++){
- if (newlabels[i] == 0){
- newlabel++;
- queue<int> Q;
- newlabels[i] = newlabel;
- Q.push(i);
- while(Q.size() > 0){
- int x;
- x = Q.front(); Q.pop();
- for (int v=0; v < edges[x].size();v++){
- int y = edges[x][v];
- if (newlabels[y] == 0){
- newlabels[y] = newlabel;
- Q.push(y);
- }
- }
- }
- }
- }
- Mat_<Vec3b> lab_rgb(image.rows, image.cols);
- int NR_MAX_CULORI = 500;
- default_random_engine gen;
- uniform_int_distribution<int> d(0,255);
- vector<Vec3b> paleta(NR_MAX_CULORI);
- paleta[0] = Vec3b(255, 255, 255);
- for (int v = 1; v < NR_MAX_CULORI; v++){
- paleta[v][0] =d(gen);
- paleta[v][1] =d(gen);
- paleta[v][2] =d(gen);
- }
- for (int i=0;i<image.rows;i++)
- for (int j=0;j<image.cols;j++){
- int index_paleta = labels(i,j) % NR_MAX_CULORI;
- int clasa_echival = newlabels[index_paleta];
- lab_rgb(i,j) = paleta[clasa_echival];
- }
- imshow("etichete", lab_rgb);
- waitKey(0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement