基于kmeans像素的聚类

15 篇文章 0 订阅
2 篇文章 0 订阅

struct KMEANSCENTER
{
    int px;    //横坐标;
    int py;    //纵坐标;
    int color[3];  //三通道值;
    KMEANSCENTER()
    {
        px = 0;
        py = 0;
        color[3] = { 0 };
    }
    ~KMEANSCENTER() {}
};

void ColorEnhance::Colorcluster_kmeans(Mat &input, vector<pair<int, int>> &UnzeroValue,int cluster_num, KMEANSCENTER centeraP[],int iterations)
{
    RNG rng;
    struct KMEANSCENTER clusterPoint;
    int Num = (int)UnzeroValue.size();
    assert(Num > 1);
    for (int k= 0;k< cluster_num;k++)//初始化聚类中心;
    {
        int y= rng.uniform(0, Num);
        centeraP[k].py = UnzeroValue[y].second;
        UnzeroValue.erase(UnzeroValue.begin() + y - 1);
        centeraP[k].color[0] = static_cast<int>(input.at<Vec3b>(0, centeraP[k].py)[0]);
        centeraP[k].color[1] = static_cast<int>(input.at<Vec3b>(0, centeraP[k].py)[1]);
        centeraP[k].color[2] = static_cast<int>(input.at<Vec3b>(0, centeraP[k].py)[2]);
        Num = (int)UnzeroValue.size();
    }//初始化聚类中心;
    multimap<int, KMEANSCENTER>ClusertVec;
    Mat2Vec(input, clusterPoint, ClusertVec);//Mat格式转换;
    assert(!ClusertVec.empty());
    float minDis = 450.0;
    int clusterK = 0;
    float dis = 0.0;
    for (int i = 0;i < iterations;i++)
    {    
        if (i == 0)  //初始聚类;
        {
            multimap<int, KMEANSCENTER>::iterator it;
            int Loop = 0;
            for (it = ClusertVec.lower_bound(7);it != ClusertVec.upper_bound(7);)
            {
                if (Loop == input.rows*input.cols)
                    break;
                if ((it->second.color[0] == 0) && (it->second.color[1] == 0) && (it->second.color[2] == 0))//如果是背景像素则不参与聚类;
                {
                    it++;
                    Loop++;
                    continue;
                }
                for (int k_iter = 0;k_iter < cluster_num;k_iter++)
                {
                    PixelDis(it->second, centeraP, k_iter, &dis);
                    if (dis < minDis)
                    {
                        clusterK = k_iter;
                        minDis = dis;
                    }
                }
                clusterPoint.px = it->second.px;
                clusterPoint.py = it->second.py;
                clusterPoint.color[0] = it->second.color[0];
                clusterPoint.color[1] = it->second.color[1];
                clusterPoint.color[2] = it->second.color[2];//找到该像素归属的类别
                if (clusterK != 7)
                {
                    ClusertVec.erase(it++);//先删除该像素原先的信息;
                    ClusertVec.insert(pair<int, KMEANSCENTER>(clusterK, clusterPoint));//增加该像素聚类后的新信息;
                }
                else
                    it++;
                minDis = 450.0;
                clusterK = 0;
                dis = 0.0;
                Loop++;
            }
        }
        else//迭代聚类过程;
        {
            multimap<int, KMEANSCENTER>::iterator it;
            int Loop = 0;
            for (int k_iter = 0;k_iter < cluster_num;k_iter++)
            {
                for (it = ClusertVec.lower_bound(k_iter);it != ClusertVec.upper_bound(k_iter);)
                {
                    if (Loop == input.rows*input.cols - 1)
                        break;
                    for (int j = 0;j < cluster_num;j++)
                    {
                        PixelDis(it->second, centeraP, j, &dis);
                        if (dis < minDis)
                        {
                            clusterK = j;
                            minDis = dis;
                        }
                    }
                    clusterPoint.px = it->second.px;
                    clusterPoint.py = it->second.py;
                    clusterPoint.color[0] = it->second.color[0];
                    clusterPoint.color[1] = it->second.color[1];
                    clusterPoint.color[2] = it->second.color[2];//找到该像素归属的类别
                    if (clusterK != k_iter)
                    {
                        ClusertVec.erase(it++);//先删除该像素原先的信息;
                        ClusertVec.insert(pair<int, KMEANSCENTER>(clusterK, clusterPoint));//增加该像素聚类后的新信息;
                    }
                    else
                        it++;
                    minDis = 450.0;
                    clusterK = 0;
                    dis = 0.0;
                    Loop++;
                }
            }
        }
        RenewCenter(centeraP, cluster_num, ClusertVec);//更新据类中心;
    }
}

代码为本人原创,禁止商用,转载请注明出处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值