Opencv:从分段彩色图像中获取所有对象

时间:2016-12-26 06:51:02

标签: c++ opencv image-processing image-segmentation

如何从图像中获取所有对象我是通过颜色分离图像对象。 下图中有近20种颜色。我想在矢量(Vec3b和Rect)中提取所有颜色及其位置。

我正在使用egbis algorithum进行细分

Input 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);

我希望得到每个颜色的位置 我可以区分对象位置。请帮助!

1 个答案:

答案 0 :(得分:1)

这只是一个简单的数据格式化问题。您希望将仅有20种左右颜色的真彩色图像转换为颜色索引图像。

只需逐步浏览图像,在您不断增长的字典中查找颜色,并为每个像素指定0-20整数。

现在,您可以将图像转换为二进制图像,只需设置一种颜色,其余颜色清晰,并使用标准算法拟合矩形。