Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void drawLabels(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat dest = Mat(src.size(), CV_8UC3);
- int label = 0;
- Mat tLabels = Mat::zeros(src.size(), CV_8UC1);
- for (int i = 1; i < tLabels.rows - 1; i++){
- for (int j = 1; j < tLabels.cols - 1; j++){
- if (src.at<uchar>(i, j) == 0 && tLabels.at<uchar>(i, j) == 0){
- label++;
- std::queue<Point> Q;
- Point p = Point(i, j);
- tLabels.at<uchar>(i, j) = label;
- Q.push(p);
- while (!Q.empty()){
- Point q = Q.front();
- Q.pop();
- for (int k = q.x - 1; k <= q.x + 1; k++){ //pt fiecare vecin din N8
- for (int l = q.y - 1; l <= q.y + 1; l++){
- Point vecin = Point(k, l);
- if (src.at<uchar>(vecin.x, vecin.y) == 0 && tLabels.at<uchar>(vecin.x, vecin.y) == 0 && k != q.x&&l != q.y){
- tLabels.at<uchar>(vecin.x, vecin.y) = label;
- Q.push(vecin);
- }
- }
- }
- }
- }
- }
- }
- Vec3b * culori = (Vec3b*)malloc((label + 1)*sizeof(Vec3b));
- for (int i = 1; i <= label; i++){
- unsigned char R = rand() % 255;
- unsigned char G = rand() % 255;
- unsigned char B = rand() % 255;
- culori[i] = Vec3b(B, G, R);
- }
- for (int i = 0; i < tLabels.rows; i++){
- for (int j = 0; j < tLabels.cols; j++)
- {
- int pozVec = tLabels.at<uchar>(i, j);
- if (pozVec == 0){
- dest.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
- }
- else{
- dest.at<Vec3b>(i, j) = culori[pozVec];
- }
- }
- }
- imshow("src image", src);
- imshow("dest image", dest);
- waitKey(0);
- }
- }
- uchar minnn(vector<uchar> L){
- uchar mic = L[0];
- for (int i = 0; i <L.size(); i++)
- {
- if (L[i]<mic)
- mic = L[i];
- }
- return mic;
- }
- void traversalTwoPass(){
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("src", img);
- int label = 0;
- Mat labelMat = Mat(img.size(), CV_8UC1); //labels
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- labelMat.at<uchar>(i, j) = 0;
- }
- }
- std::queue<Point2i> myqueue;
- vector<vector<int>> edges(10);
- for (int i = 1; i < img.rows-1; i++){
- for (int j = 1; j < img.cols-1; j++){
- if (img.at<uchar>(i, j) == 0 && labelMat.at<uchar>(i, j) == 0){
- vector<uchar> L;
- int di[4] = { -1, 0, 1, 0 };
- int dj[4] = { 0, -1, 0, 1 };
- uchar neighbors[4];
- for (int k = 0; k < 4; k++){
- neighbors[k] = img.at<uchar>(i + di[k], j + dj[k]);
- if (labelMat.at<uchar>(i + di[k], j + dj[k]) > 0){
- L.push_back(labelMat.at<uchar>(i + di[k], j + dj[k]) > 0);
- }
- }
- if (L.size() == 0){
- label++;
- labelMat.at<uchar>(i, j) = label;
- }
- else {
- uchar x = minnn(L);
- labelMat.at<uchar>(i, j) = x;
- for (int y = 0; y <L.size(); y++){
- if (x != y){
- edges[x].push_back(y);
- edges[y].push_back(x);
- }
- }
- }
- }
- }
- }
- int newLabel = 0;
- Vector<uchar> newLabels;
- for (int i = 1; i < label + 1; i++){
- newLabels[i] = 0;
- }
- for (int i = 1; i < label; i++){
- if (newLabels[i] == 0){
- newLabel++;
- std::queue<int> myqueue;
- newLabels[i] = newLabel;
- myqueue.push(i);
- while (!myqueue.empty()){
- int crt = myqueue.front();
- myqueue.pop();
- for (int y = 0; y < edges[crt].size(); y++){
- if (newLabels[y] == 0){
- newLabels[y] = newLabel;
- myqueue.push(y);
- }
- }
- }
- }
- }
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- labelMat.at<uchar>(i, j) = newLabels[labelMat.at<uchar>(i, j)];
- }
- }
- imshow("src2", img);
- waitKey(0);
- Vec3b colors[256] = { 0 };
- colors[0] = Vec3b(255, 255, 255);
- for (int labeldIndex = 1; labeldIndex <= label; labeldIndex++){
- uchar v1 = rand() % 256;
- uchar v2 = rand() % 256;
- uchar v3 = rand() % 256;
- colors[labeldIndex] = Vec3b(v1, v2, v3);
- }
- Mat newImg = Mat(img.rows, img.cols, CV_8UC3);
- for (int i = 0; i < img.rows; i++){
- for (int j = 0; j < img.cols; j++){
- newImg.at<Vec3b>(i, j) = colors[labelMat.at<uchar>(i, j)];
- }
- }
- imshow("src2", newImg);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement