2016-12-26 6 views
1

イメージからすべてのオブジェクトを取得する方法イメージオブジェクトを色で分けています。 次の画像には約20色あります。私はすべての色とその位置をベクトル(Vec3bとRect)で抽出したいと思います。Opencv:分割されたカラフルな画像からすべてのオブジェクトを取得

私は私がオブジェクトの位置を区別することができます ように、私は、各色の位置を取得したいセグメンテーション

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

ためegbis algorithumを使用しています。助けてください!

+0

入力画像と期待される出力結果も提供してください。入力画像を色分けするためのカスタムアルゴリズムを書く必要はありません。Opencvには、同じ処理を行う 'kmeans'のような機能が組み込まれています。 – ZdaR

+0

@ZdaR今すぐご覧ください –

+0

私はhttps://github.com/christofferholmstedt/opencv-wrapper-egbis –

答えて

0

これはちょっとしたデータフォーマットの問題です。トゥルーカラーのイメージを20色ほどの色でカラーインデックス付きイメージに変換したいとします。

単純にイメージをステップインし、成長する辞書の色をルックアップし、整数0-20を各ピクセルに割り当てます。

これで、1つの色が設定され、残りの部分がクリアであると言うだけで、イメージをバイナリイメージに変えることができます。

+0

ソースコードを共有していただけますか? –

関連する問題