別の画像を作成し、その中のデータのマスクされていないデータをコピーし、このマトリックスを使用してkmeansを実行します。これがその方法です:
[編集]
以下は機能せず、マスク内のピクセルを黒く塗りつぶすだけですが、tmpのサイズは元の画像と同じです。cv :: Mat tmp; labImage.copyTo(tmp、mask);
事前にtmpマトリックスを割り当て、マスク上のループで埋める必要があります。
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);