c语言环境下opencv图像K均值聚类,【OpenCV学习】Kmean均值聚类对图片进行减色处理...

#include

#include

#include

#define MAX_CLUSTERS (8)

using namespace std;

int main( int argc, char **argv)

{

IplImage *imgA = cvLoadImage( "1.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);

if(imgA ==NULL)

{

cout<

exit(0);

}

cvNamedWindow("window",CV_WINDOW_AUTOSIZE);

cvShowImage("window",imgA);//加载原图

unsigned long int size;

size = imgA->width * imgA->height;//取得图片大小

CvMat *clusters;//分类后的矩阵

clusters = cvCreateMat (size, 1, CV_32SC1);//32位1通道的矩阵

CvMat *points;//分类前的样例浮点矩阵

points = cvCreateMat (size, 1, CV_32FC3); //32位3通道的矩阵

unsigned long int i;

for (i = 0; i < size; i++)

{

points->data.fl[i*3] = (unsigned char) imgA->imageData[i*3];

points->data.fl[i*3 + 1] = (unsigned char) imgA->imageData[i*3 + 1];

points->data.fl[i*3 + 2] = (unsigned char) imgA->imageData[i*3 + 2];

} //得到三通道图像的数据

cvKMeans2 (points, MAX_CLUSTERS, clusters,

cvTermCriteria (CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 10, 1.0));

//拆分为8类聚合,最大迭代次数是10,精度是1.0

CvMat *color = cvCreateMat (MAX_CLUSTERS, 1, CV_32FC3);//8行1列的三通道浮点矩阵

CvMat *count = cvCreateMat (MAX_CLUSTERS, 1, CV_32SC1);//8行1列的单通道整数矩阵,用作计数

cvSetZero (color);

cvSetZero (count);

for (i = 0; i < size; i++)

{

int idx = clusters->data.i[i];

int j = ++count->data.i[idx];

color->data.fl[idx * 3 ] = color->data.fl[idx * 3 ] * (j - 1) / j + points->data.fl[i * 3 ] / j;

color->data.fl[idx * 3 + 1] = color->data.fl[idx * 3 + 1] * (j - 1) / j + points->data.fl[i * 3 + 1] / j;

color->data.fl[idx * 3 + 2] = color->data.fl[idx * 3 + 2] * (j - 1) / j + points->data.fl[i * 3 + 2] / j;

}

//把处理过的数据打回imgA

for (i = 0; i < size; i++)

{

int idx = clusters->data.i[i];

imgA->imageData[i * 3 ] = (char) color->data.fl[idx * 3 ];

imgA->imageData[i * 3 + 1] = (char) color->data.fl[idx * 3 + 1];

imgA->imageData[i * 3 + 2] = (char) color->data.fl[idx * 3 + 2];

}

cvNamedWindow("window2",CV_WINDOW_AUTOSIZE);

cvShowImage("window2",imgA);

cvWaitKey(0);

cvReleaseImage( &imgA );

cvDestroyWindow("window");

cvDestroyWindow("window2");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值