【OpenCV学习】Kmean均值聚类对图片进行减色处理

简介:         #include #include #include #define MAX_CLUSTERS (8) using namespace std; int main( int argc, char **argv) { IplImage *imgA = cvLoadImage( "1.
 
 
 
 
 
#include <cv.h>
#include <highgui.h>
#include <iostream>


#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<<"Can't Load Image ." << endl;
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;
}

 
 
 
 
 
 
 

8224732891282247349827

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

相关文章
|
4月前
|
计算机视觉 Python
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
53 0
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
4月前
|
算法 数据挖掘 计算机视觉
OpenCV中应用尺度不变特征变换SIFT算法讲解及实战(附源码)
OpenCV中应用尺度不变特征变换SIFT算法讲解及实战(附源码)
31 0
|
4月前
|
编解码 算法 计算机视觉
OpenCV(十七):拉普拉斯图像金字塔
OpenCV(十七):拉普拉斯图像金字塔
48 0
|
4月前
|
编解码 计算机视觉
OpenCV(十六):高斯图像金字塔
OpenCV(十六):高斯图像金字塔
37 1
|
6月前
|
机器学习/深度学习 人工智能 文字识别
OpenCV-字典法实现数字识别(尺寸归一化+图像差值)
OpenCV-字典法实现数字识别(尺寸归一化+图像差值)
|
API 计算机视觉
opencv之直方图比较图像相似度
对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间 然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进 而比较图像本身的相似程度。
335 0
opencv之直方图比较图像相似度
|
机器学习/深度学习 算法 数据可视化
梯度直方图(HOG)用于图像多分类和图像推荐(下)
梯度直方图(HOG)用于图像多分类和图像推荐
107 0
梯度直方图(HOG)用于图像多分类和图像推荐(下)
|
机器学习/深度学习 Python
梯度直方图(HOG)用于图像多分类和图像推荐(上)
梯度直方图(HOG)用于图像多分类和图像推荐
127 0
梯度直方图(HOG)用于图像多分类和图像推荐(上)
|
算法 数据可视化 索引
ML之SIFT_FLANN:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化
ML之SIFT_FLANN:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化
ML之SIFT_FLANN:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化