2

実は公式Q&Aですでにこの質問をしましたが、まだ回答がありません。

私の仕事は、画像全体ではなく、マスクされた部分にのみkmeansクラスタリングを使用することです。したがって、入力として2つの画像があります。

  1. マスクされた画像。
  2. 画像はLab色空間に変換されます。

また、画像をn個のクラスターにクラスター化する場合、マスクを使用してクラスター化した後、n + 1個のクラスター(マスクのために+1)の画像が必要です。

もちろん、私はそれを調べてグーグルで検索しましたが、何も見つかりませんでした。

アドバイスありがとうございます。

4

1 に答える 1

4

別の画像を作成し、その中のデータのマスクされていないデータをコピーし、このマトリックスを使用してkmeansを実行します。これがその方法です:

[編集]

以下は機能せず、マスク内のピクセルを黒く塗りつぶすだけですが、tmpのサイズは元の画像と同じです。cv :: Mat tmp; labImage.copyTo(tmp、mask);

事前にt​​mpマトリックスを割り当て、マスク上のループで埋める必要があります。

cv::Mat tmp = cv::Mat::zeros(cv::countNonZero(mask), 1, labImage.type());
int counter = 0;
for (int r = 0; r < mask.rows; ++r)
  for (int c = 0; c < mask.cols; ++c) 
    if (!mask.at<unsigned char>(r, c))
      // I assume Lab pixels are stored as a vector of floats
      tmp.at<cv::Vec3f>(counter++, 0) = labImage.at<cv::Vec3b>(r, c);

[/編集]

cv::kmeans(tmp, k, labels);

// Now to compute your image of labels
cv::Mat labelsImage = cv::Mat(labImage.size(), CV_32S, k); // initialize pixel values to K, which is the index of your N+1 cluster

// Now loop through your pixel mask and set the correspondance in your labelImage
int counter = 0;
for (int r = 0; r < mask.rows; ++r)
  for (int c = 0; c < mask.cols; ++c) 
    if (!mask.at<unsigned char>(r, c))
      labelsImage.at<int>(r, c) = labels.at<int>(counter++, 0);
于 2012-10-20T20:29:22.393 に答える