opencv - 如何将 K 均值应用于图像的蒙版而不是整个图像

标签 opencv cluster-analysis k-means

我想在 OpenCV 上对非正方形或矩形的图像区域应用 K 均值。例如源图像是:

enter image description here

现在我选择一个自定义 mask :

enter image description here

并应用 K 均值,K = 3:

enter image description here

显然没有考虑边界(白色)。

相反,我可以用 OpenCV 做的是 K 均值,但考虑到边界:

enter image description here

这弄乱了我的最终图像,因为黑色被认为是一种颜色。

你有什么线索吗?

提前谢谢你。

最佳答案

快速而肮脏的解决方案。

vector<Vec3b> points;
vector<Point> locations;
for( int y = 0; y < src.rows; y++) {
    for( int x = 0; x < src.cols; x++) {
        if ( (int)mask.at<unsigned char>(y,x) != 0 ) {
            points.push_back(src.at<Vec3b>(y,x));
            locations.push_back(Point(x,y));
        }
    }   
}
Mat kmeanPoints(points.size(), 3, CV_32F);
for( int y = 0; y < points.size(); y++ ) {
    for( int z = 0; z < 3; z++) {
        kmeanPoints.at<float>(y, z) = points[y][z];
    }
}

Mat labels;
Mat centers;
kmeans(kmeanPoints, 4, labels, TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 10, 0.1), 10, cv::KMEANS_PP_CENTERS, centers);
Mat final = Mat::zeros( src.size(), src.type() );
Vec3b tempColor;

for(int i = 0; i<locations.size(); i++) {
    int cluster_idx = labels.at<int>(i,0);
    tempColor[0] = centers.at<float>(cluster_idx, 0);
    tempColor[1] = centers.at<float>(cluster_idx, 1);
    tempColor[2] = centers.at<float>(cluster_idx, 2);
    final.at<Vec3b>(locations[i]) = tempColor;
}

关于opencv - 如何将 K 均值应用于图像的蒙版而不是整个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29037714/

相关文章:

python-2.7 - 如何使用 python 或 OpenCV 根据局部特征或全局自动将我的数据集图像聚类到不同的组中?

python - sklearn中KMeans的变换是否可以逆转?

opencv - `IplImage`和 `CvMat`在OpenCV中的全称是什么?

c++ - OpenCV 函数来计算类似于 MATLAB 产品的数组元素的乘积?

c++ - 应用程序在 OpenCV 的 equalizeHist 上崩溃

python - 如何在 DBSCAN 中使用 knn 距离图估计 eps

image - OpenCV:处理 12 位灰度原始数据

r - 如何从不同(戴安娜,簇R包)输出中获得最佳簇数?

python - 3D 矩阵上的 K 均值

machine-learning - 选择适当的相似性度量并评估 k 均值聚类模型的有效性