Opencv: Get all objects from segmented colorful image

2.1k Views Asked by At

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!

1

There are 1 best solutions below

0
On

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.