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);//更新据类中心;
}
}
代码为本人原创,禁止商用,转载请注明出处。