Adeel Nazir
Adeel Nazir

Reputation: 49

Opencv: Get all objects from segmented colorful image

How to get all objects from image i am separating image objects through colors. There are almost 20 colors in following image. I want to extract all colors and their position in a vector(Vec3b and Rect).

I'm using egbis algorithum for segmentation

Input Image

Segmented image

enter image description here

Mat src, dst;
  String imageName("/home/pathToImage.jpg" );
  src = imread(imageName,1);
  if(src.rows < 1)
      return -1;
  for(int i=0; i<src.rows; i=i+5)
  {    for(int j=0; j<src.cols; j=j+5)
      {
          Vec3b color = src.at<Vec3b>(Point(i,j));
          if(colors.empty())
            {
                colors.push_back(color);
            }
          else{
              bool add = true;
            for(int k=0; k<colors.size(); k++)
            {
                 int     rmin = colors[k].val[0]-5,
                  rmax = colors[k].val[0]+5,
                  gmin = colors[k].val[1]-5,
                  gmax = colors[k].val[1]+5,
                  bmin = colors[k].val[2]-5,
                  bmax = colors[k].val[2]+5;
                if((
                        (color.val[0] >= rmin && color.val[0] <= rmax) &&
                        (color.val[1] >= gmin && color.val[1] <= gmax) &&
                        (color.val[2] >= bmin && color.val[2] <= bmax))

                )
                {
                    add = false;
                    break;
                }

            }
            if(add)
                colors.push_back(color);

          }
      }
  }
  int size = colors.size();
  for(int i=0; i<colors.size();i++)
  {
      Mat inrangeImage;
      //cv::inRange(src, Scalar(lowBlue, lowGreen, lowRed), Scalar(highBlue, highGreen, highRed), redColorOnly);
      cv::inRange(src, cv::Scalar(colors[i].val[0]-1, colors[i].val[1]-1, colors[i].val[2]-1), cv::Scalar(colors[i].val[0]+1, colors[i].val[1]+1, colors[i].val[2]+1), inrangeImage);
      imwrite("/home/kavtech/Segmentation/1/opencv-wrapper-egbis/images/inrangeImage.jpg",inrangeImage);
  }
  /// Display
  namedWindow("Image", WINDOW_AUTOSIZE );
  imshow("Image", src );
  waitKey(0);

I want to get each color position so that i can differentiate object positions. Please Help!

Upvotes: 1

Views: 2199

Answers (1)

Malcolm McLean
Malcolm McLean

Reputation: 6404

That's just a trivial data formatting problem. You want to turn a truecolour image with only 20 or so colours into a colour-indexed image.

So simply step through the image, look up the colour in your growing dictionary, and assign and integer 0-20 to each pixel.

Now you can turn the images into binary images simply by saying one colour is set and the rest are clear, and use standard algorithms for fitting rectangles.

Upvotes: 1

Related Questions