其实我已经在官方问答中问过这个问题,但还没有得到任何答案。
我的任务是不是对整个图像使用kmeans 聚类,而只是对它的蒙版部分使用。所以作为输入,我有两个图像:
- 蒙面图像。
- 图像转换为 Lab 颜色空间。
如果我在n 个集群上对图像进行聚类,则在使用掩码进行聚类后,我希望获得具有n+1个集群的图像(由于掩码而 +1)。
当然,我研究并搜索了它,但一无所获。
感谢您的任何建议。
创建另一个图像,复制其中的数据未屏蔽数据,并使用此矩阵执行您的 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);