2

其实我已经在官方问答中问过这个问题,但还没有得到任何答案。

我的任务是不是对整个图像使用kmeans 聚类,而只是对它的蒙版部分使用。所以作为输入,我有两个图像:

  1. 蒙面图像。
  2. 图像转换为 Lab 颜色空间。

如果我在n 个集群上对图像进行聚类,则在使用掩码进行聚类后,我希望获得具有n+1个集群的图像(由于掩码而 +1)。

当然,我研究并搜索了它,但一无所获。

感谢您的任何建议。

4

1 回答 1

4

创建另一个图像,复制其中的数据未屏蔽数据,并使用此矩阵执行您的 kmeans。事情是这样的:

[编辑]

以下不起作用,它只是遮罩中的像素,但 tmp 与原始图像具有相同的尺寸。简历::垫 tmp; labImage.copyTo(tmp, 掩码);

您应该事先分配 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);
于 2012-10-20T20:29:22.393 回答