opencv kmeans 算法例子

来源:互联网 发布:手机快速下载软件 编辑:程序博客网 时间:2024/05/22 10:31

kmeans算法主要用来实现自动聚类,是一种非监督的机器学习算法,使用非常广泛。在opencv3.0中提供了这样一个函数,直接调用就能实现自动聚类,非常方便。

函数原型:

C++: double kmeans(InputArray data, int K, InputOutputArray bestLabels, TermCriteria criteria, int attempts, int flags, OutputArray centers=noArray() )

有7个参数,分别表示:

data:  需要自动聚类的数据,一般是一个Mat。浮点型的矩阵,每行为一个样本。

k: 取成几类,比较关键的一个参数。

bestLabels:  返回的类别标记,整型数字。

criteria: 算法结束的标准,获取期望精度的迭代最大次数

attempts:  判断某个样本为某个类的最少聚类次数,比如值为3时,则某个样本聚类3次都为同一个类,则确定下来。

flags:  确定簇心的计算方式。有三个值可选:KMEANS_RANDOM_CENTERS 表示随机初始化簇心。KMEANS_PP_CENTERS 表示用kmeans++算法来初始化簇心(没用过),KMEANS_USE_INITIAL_LABELS 表示第一次聚类时用用户给定的值初始化聚类,后面几次的聚类,则自动确定簇心。

centers: 用来初始化簇心的。与前一个flags参数的选择有关。如果选择KMEANS_RANDOM_CENTERS随机初始化簇心,则这个参数可省略。



#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
    const int MAX_CLUSTERS = 5;
    Vec3b colorTab[] =
    {
        Vec3b(0, 0, 255),
        Vec3b(0, 255, 0),
        Vec3b(255, 100, 100),
        Vec3b(255, 0, 255),
        Vec3b(0, 255, 255)
    };
    Mat data,labels;
    //Mat pic = imread("e:\\ocr\\1.bmp");
Mat pic = imread("D:\\SVMstudy\\1.bmp");

    for (int i = 0; i < pic.rows;i++)
    for (int j = 0; j < pic.cols; j++)
    {
        Vec3b point = pic.at<Vec3b>(i, j);
        Mat tmp = (Mat_<float>(1, 3) << point[0], point[1], point[2]);
        data.push_back(tmp);
    }


    //根据浏览图片,确定k=3
    kmeans(data, 3, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0),
        3, KMEANS_RANDOM_CENTERS);


    int n = 0;
    //显示聚类结果,不同的类别用不同的颜色显示
    for (int i = 0; i < pic.rows; i++)
    for (int j = 0; j < pic.cols; j++)
    {
        int clusterIdx = labels.at<int>(n);
        pic.at<Vec3b>(i, j) = colorTab[clusterIdx];
        n++;
    }
    imshow("pic", pic);
    waitKey(0);
    
    return 0;
}

0 0
原创粉丝点击