我正在尝试在openCV中的图像上实现kmeans聚类(使用C)。与导致一些颜色层的聚集图像不同,输出非常奇怪。我也尝试调试代码,但无法理解它可能出错的地方。
这是输入和输出图像。
右边是输出,左边是输入图像。
这是代码:
image = cvLoadImage( "pic65.png", CV_LOAD_IMAGE_UNCHANGED);
sample = cvCreateMat( image->height*image->width, 5, CV_32FC1 );
clusters = cvCreateMat( image->height*image->width, 1, CV_32SC1 );
data = (uchar *)image->imageData;
for(i=0;i<image->height;i++)
{
for(j=0;j<image->width;j++)
{
cvSetReal2D( sample, k, 0, i);
cvSetReal2D( sample, k, 1, j);
b = data[i*image->widthStep + j*image->nChannels +0];
g = data[i*image->widthStep + j*image->nChannels +1];
r = data[i*image->widthStep + j*image->nChannels +2];
cvSetReal2D( sample, k, 2, b);
cvSetReal2D( sample, k, 3, g);
cvSetReal2D( sample, k, 4, r);
k++;
}
}
count = get_clusters();
cvKMeans2(sample,count,clusters,cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,100,0 ));
for (x = 0; x < image->height; x++)
{
for (y = 0; y < image->width; y++)
{
index = x * image->width + y;
cluster_index = cvGetReal2D(clusters,index,0);
data[x*image->widthStep + y*image->nChannels +0] = cl[cluster_index][0];
data[x*image->widthStep + y*image->nChannels +1] = cl[cluster_index][2];
data[x*image->widthStep + y*image->nChannels +2] = cl[cluster_index][2];
}
}
get_clusters 方法根据阈值(在本例中为 30)返回输入图像中颜色簇的数量。如果需要,我也可以为您提供 get_clusters 的代码,但我认为它是正确的。
有人可以指出哪里出错了。任何形式的帮助表示赞赏。提前致谢。
编辑:我想要的输出如下: