KMeans2()函数能对图片进行聚类处理吗?

crystal8700 2010-04-14 10:28:23
如题!我只找到KMeans2()函数对两个矩阵进行聚类处理的,我试着将图片作为处理对象,却不能成功。我自己的程序如下:
#include"stdafx.h"
#include"cxcore.h"
#include"highgui.h"
int main(int argc,char** argv)
{
cvNamedWindow("cluster",0);
IplImage* src=cvLoadImage("D:\\001.jpg",1);
IplImage* out=cvCreateImage(cvGetSize(src),IPL_DEPTH_32S,1);
CvRNG rng=cvRNG(0xffffffff);
int cluster_count=cvRandInt(&rng)%5+1;
cvKMeans2(src,cluster_count,out,cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,10,1.0));
cvShowImage("cluster",out);
cvWaitKey(0);
cvReleaseImage(&out);
cvDestroyWindow("cluster");
return 0;
}
运行时会出现如下错误提示:
...全文
471 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
goup000 2011-03-14
  • 打赏
  • 举报
回复
crystal8700
我在毕业设计中遇到了和您一样的问题,已经纠结很长时间了,可以问一下您 的问题怎么解决的吗?谢谢了。如果有程序的话可以发给我吗?goup000@163.com
crystal8700 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yzm888 的回复:]
void cvKMeans2( const CvArr* samples, int cluster_count,
CvArr* labels, CvTermCriteria termcrit );
-------------------------------------------------
这个应该是一个通用的 函数

要使用这个函数的话,首先要理解K Mean,

然后要……
[/Quote]
谢谢你的回帖!我想我现在的问题就是没法构造这些参数吧~我再下去看看!
验证码识别 2010-04-14
  • 打赏
  • 举报
回复
我现在需要将一幅图像进行聚类处理
---------------------------------

具体想要怎样处理?

K Mean 只是一个算法,与图像没有关系
crystal8700 2010-04-14
  • 打赏
  • 举报
回复
谢谢楼上的帖子!你提供的资料正是我一直在研究的,那个程序看了好久也不是很懂!我现在需要将一幅图像进行聚类处理,例如:IplImage* src=cvLoadImage("D:\\001.jpg",0);现在我再定义一幅图像用于存放聚类后的结果:IplImage* dst=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);然后我想直接将src和dst作为KMeans2()的参数,即:cvKMeans2(src,cluster_count,dst,termcrit);但是运行的结果显示这样做是不行的。谁能帮我分析一下我的想法错在哪里?
另外,我今天第一次在这上面发帖,我想将运行时错误提示的图片传上来,为什么传不上来呢?
xiuxianshen 2010-04-14
  • 打赏
  • 举报
回复
KMeans2
按照给定的类别数目对样本集合进行聚类

void cvKMeans2( const CvArr* samples, int cluster_count,
CvArr* labels, CvTermCriteria termcrit );
samples
输入样本的浮点矩阵,每个样本一行。
cluster_count
所给定的聚类数目
labels
输出整数向量:每个样本对应的类别标识
termcrit
指定聚类的最大迭代次数和/或精度(两次迭代引起的聚类中心的移动距离)
函数 cvKMeans2 执行 k-means 算法 搜索 cluster_count 个类别的中心并对样本进行分类,输出 labels(i) 为样本 i 的类别标识。

例子. 用 k-means 对高斯分布的随机样本进行聚类

#include "cxcore.h"
#include "highgui.h"

int main( int argc, char** argv )
{
#define MAX_CLUSTERS 5
CvScalar color_tab[MAX_CLUSTERS];
IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
CvRNG rng = cvRNG(0xffffffff);

color_tab[0] = CV_RGB(255,0,0);
color_tab[1] = CV_RGB(0,255,0);
color_tab[2] = CV_RGB(100,100,255);
color_tab[3] = CV_RGB(255,0,255);
color_tab[4] = CV_RGB(255,255,0);

cvNamedWindow( "clusters", 1 );

for(;;)
{
int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1;
int i, sample_count = cvRandInt(&rng)%1000 + 1;
CvMat* points = cvCreateMat( sample_count, 1, CV_32FC2 );
CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 );

/* generate random sample from multigaussian distribution */
for( k = 0; k < cluster_count; k++ )
{
CvPoint center;
CvMat point_chunk;
center.x = cvRandInt(&rng)%img->width;
center.y = cvRandInt(&rng)%img->height;
cvGetRows( points, &point_chunk, k*sample_count/cluster_count,
k == cluster_count - 1 ? sample_count : (k+1)*sample_count/cluster_count );
cvRandArr( &rng, &point_chunk, CV_RAND_NORMAL,
cvScalar(center.x,center.y,0,0),
cvScalar(img->width/6, img->height/6,0,0) );
}

/* shuffle samples */
for( i = 0; i < sample_count/2; i++ )
{
CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
CvPoint2D32f temp;
CV_SWAP( *pt1, *pt2, temp );
}

cvKMeans2( points, cluster_count, clusters,
cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ));

cvZero( img );

for( i = 0; i < sample_count; i++ )
{
CvPoint2D32f pt = ((CvPoint2D32f*)points->data.fl)[i];
int cluster_idx = clusters->data.i[i];
cvCircle( img, cvPointFrom32f(pt), 2, color_tab[cluster_idx], CV_FILLED );
}

cvReleaseMat( &points );
cvReleaseMat( &clusters );

cvShowImage( "clusters", img );

int key = cvWaitKey(0);
if( key == 27 ) // 'ESC'
break;
}
}
xiuxianshen 2010-04-14
  • 打赏
  • 举报
回复
贴错误原因,你的图挂了
验证码识别 2010-04-14
  • 打赏
  • 举报
回复
void cvKMeans2( const CvArr* samples, int cluster_count,
CvArr* labels, CvTermCriteria termcrit );
-------------------------------------------------
这个应该是一个通用的 函数

要使用这个函数的话,首先要理解K Mean,

然后要理解这些参数,然后构造这些参数(把图象信息转换为这些参数)
crystal8700 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yzm888 的回复:]
KMeans 只是一种聚类方法,无领域限制,当然可以用来处理图像

K Means 只是一个方法、一种思想, 就和 二分查找法一样

与具体实现无关,具体的实现要根据实际的需求定制(运用这种思想,写具体的代码)
[/Quote]
我们把论文上的算法思想与KMeans()函数对比,发现它正好能实现我们需要的功能。现在的问题是我们不知道怎么用它。
验证码识别 2010-04-14
  • 打赏
  • 举报
回复
你的意思是说不能用KMeans()函数直接处理图像吗?
--------------------------
除非这个KMeans()函数正好实现了你需要的功能
验证码识别 2010-04-14
  • 打赏
  • 举报
回复
KMeans 只是一种聚类方法,无领域限制,当然可以用来处理图像

K Means 只是一个方法、一种思想, 就和 二分查找法一样

与具体实现无关,具体的实现要根据实际的需求定制(运用这种思想,写具体的代码)
crystal8700 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yzm888 的回复:]
我现在需要将一幅图像进行聚类处理
---------------------------------

具体想要怎样处理?

K Mean 只是一个算法,与图像没有关系
[/Quote]

谢谢!能不能说得具体一点!你的意思是说不能用KMeans()函数直接处理图像吗?
论文上写的two-means clustering method,是要将微生物图像进行聚类处理。我们希望可以直接用现成的函数处理,以免重新编程。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧