📄 gatherdlg.cpp
字号:
}
if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
&&single[5]==1&&single[6]==0&&single[7]==0&&single[8]==0&&single[9]==0)
{
crColor1=pDC4.SetPixel( i+600,j, RGB(0,255,255));
}
if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
&&single[5]==0&&single[6]==1&&single[7]==0&&single[8]==0&&single[9]==0)
{
crColor1=pDC4.SetPixel( i+600,j, RGB(128,0,128));
}
if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
&&single[5]==0&&single[6]==0&&single[7]==1&&single[8]==0&&single[9]==0)
{
crColor1=pDC4.SetPixel( i+600,j, RGB(0,128,128));
}
if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
&&single[5]==0&&single[6]==0&&single[7]==0&&single[8]==1&&single[9]==0)
{
crColor1=pDC4.SetPixel( i+600,j, RGB(116,202,240));
}
if(single[0]==0&&single[1]==0&&single[2]==0&&single[3]==0&&single[4]==0
&&single[5]==0&&single[6]==0&&single[7]==0&&single[8]==0&&single[9]==1)
{
crColor1=pDC4.SetPixel( i+600,j, RGB(0,0,0));
}
ii++;
}
}
JuLeiCiShuXianShi++;
UpdateData(FALSE);
ReleaseDC(&pDC4);
}
void CGatherDlg::ChargeAndGive(int kk)///kk是类数的参数调用此函数时要用到循环
{
int ii=0;
leineiyangbengeshu=0;
for(i=0;i<wide;i++)
{
for(j=0;j<hieght;j++)
{
/////////////////////一维模式的聚类////////////////
if(juleimoshi==2)
{
if(gdt[kk][ii]==1)
{
gdata1[i][j]=gdata[i][j];
leineiyangbengeshu++;
}
if(gdt[kk][ii]==0)
{
gdata1[i][j]=0;
}
}
if(juleimoshi==1)
{
if(rdt[kk][ii]==1)
{
rdata1[i][j]=rdata[i][j];
leineiyangbengeshu++;
}
if(rdt[kk][ii]==0)
{
rdata1[i][j]=0;
}
}
if(juleimoshi==3)
{
if(bdt[kk][ii]==1)
{
bdata1[i][j]=bdata[i][j];
leineiyangbengeshu++;
}
if(bdt[kk][ii]==0)
{
bdata1[i][j]=0;
}
}
////////////////////////二维模式的///////////////////////////////
if(juleimoshi==4)
{
if(gdt[kk][ii]==1&&rdt[kk][ii]==1)
{
gdata1[i][j]=gdata[i][j];
rdata1[i][j]=rdata[i][j];
leineiyangbengeshu++;
}
if(gdt[kk][ii]==0&&rdt[kk][ii]==0)
{
gdata1[i][j]=0;
rdata1[i][j]=0;
}
}
if(juleimoshi==5)
{
if(rdt[kk][ii]==1&&bdt[kk][ii]==1)
{
rdata1[i][j]=rdata[i][j];
bdata1[i][j]=bdata[i][j];
leineiyangbengeshu++;
}
if(rdt[kk][ii]==0&&bdt[kk][ii]==0)
{
rdata1[i][j]=0;
bdata1[i][j]=0;
}
}
if(juleimoshi==6)
{
if(bdt[kk][ii]==1&&gdt[kk][ii]==1)
{
bdata1[i][j]=bdata[i][j];
gdata1[i][j]=gdata[i][j];
leineiyangbengeshu++;
}
if(bdt[kk][ii]==0&&gdt[kk][ii]==0)
{
bdata1[i][j]=0;
gdata1[i][j]=0;
}
}
///////////////////////三位模式的聚类///////////////////////////
if(juleimoshi==7)
{
if(bdt[kk][ii]==1&&gdt[kk][ii]==1&&rdt[kk][ii]==1)
{
bdata1[i][j]=bdata[i][j];
gdata1[i][j]=gdata[i][j];
rdata1[i][j]=rdata[i][j];
leineiyangbengeshu++;
}
if(bdt[kk][ii]==0&&gdt[kk][ii]==0&&rdt[kk][ii]==0)
{
bdata1[i][j]=0;
gdata1[i][j]=0;
rdata1[i][j]=0;
}
}
ii++;
}
}
}
void CGatherDlg::Check(int lei)
{
int c=0;
int c11=0;
int c12=0;
for(i=0;i<wide*hieght;i++)
{
for(j=0;j<lei;j++)
{
if(gdt[j][i]==1)
{
c++;
}
if(c>1)
{
c11++;//错误个数
}
if(c==1)
{
c12++;//1的个数
}
}
c=0;
}
}
void CGatherDlg::Gather(float yuzhi, int shangxian, int leishu, myRGB rgbGther[])
{
int ii=0;
int cishu=0;
int mincount_dis;//最小距离在数组中的序号
int mincount_g,mincount_r,mincount_b,mincount_rg,mincount_rb,mincount_bg;
double gd[10],rd[10],bd[10];
double dis[10],dis_rg[10],dis_rb[10],dis_bg[10];
double a=0,b=0,c=0;//分别为G,R,B的平均值
//double *d1,*d2,*d3;
while(cishu<shangxian)
{
/////////////////////////////////////////////
//pDC5.SetPixelV(700+zhongxin1,10,(0,0,255));
//pDC5.SetPixelV(700+zhongxin2,10,(0,0,255));
SetZero(leishu,0);
ii=0;
for(i=0;i<wide;i++)
{
for(j=0;j<hieght;j++)
{
for(int lei=0;lei<leishu;lei++)
{
if(juleimoshi==2)
{gd[lei]=fabs((gdata[i][j]-rgbGther[lei].G));}
if(juleimoshi==1)
{rd[lei]=fabs((rdata[i][j]-rgbGther[lei].R));}
if(juleimoshi==3)
{bd[lei]=fabs((bdata[i][j]-rgbGther[lei].B));}
if(juleimoshi==7)
{
bd[lei]=fabs((bdata[i][j]-rgbGther[lei].B));
gd[lei]=fabs((gdata[i][j]-rgbGther[lei].G));
rd[lei]=fabs((rdata[i][j]-rgbGther[lei].R));
dis[lei]=(pow(gd[lei],2)+pow(rd[lei],2)+pow(bd[lei],2));}
if(juleimoshi==4)
{
gd[lei]=fabs((gdata[i][j]-rgbGther[lei].G));
rd[lei]=fabs((rdata[i][j]-rgbGther[lei].R));
dis_rg[lei]=(pow(gd[lei],2)+pow(rd[lei],2));}
if(juleimoshi==5)
{
bd[lei]=fabs((bdata[i][j]-rgbGther[lei].B));
rd[lei]=fabs((rdata[i][j]-rgbGther[lei].R));
dis_rb[lei]=(pow(bd[lei],2)+pow(rd[lei],2));}
if(juleimoshi==6)
{
gd[lei]=fabs((gdata[i][j]-rgbGther[lei].G));
bd[lei]=fabs((bdata[i][j]-rgbGther[lei].B));
dis_bg[lei]=(pow(gd[lei],2)+pow(bd[lei],2));}
//ShowCenter(rgbGther,lei);
}
//////////////////三维模式的聚类///////////////////////////////
if(juleimoshi==7)
{
mincount_dis=Min(dis,leishu);
for(lei=0;lei<leishu;lei++)
{
if(lei==mincount_dis)
{
gdt[lei][ii]=1;
rdt[lei][ii]=1;
bdt[lei][ii]=1;
}
if(lei!=mincount_dis)
{
gdt[lei][ii]=0;
rdt[lei][ii]=0;
bdt[lei][ii]=0;
}
}
}
/////////////////////////一维模式R的///////////////////////////
if(juleimoshi==1)
{
mincount_r=Min(rd,leishu);
for(lei=0;lei<leishu;lei++)
{
if(lei==mincount_r)
{
rdt[lei][ii]=1;
}
if(lei!=mincount_r)
{
rdt[lei][ii]=0;
}
}
}
/////////////////////////一维模式G的///////////////////////////
if(juleimoshi==2)
{
mincount_g=Min(gd,leishu);
for(lei=0;lei<leishu;lei++)
{
if(lei==mincount_g)
{
gdt[lei][ii]=1;
}
if(lei!=mincount_g)
{
gdt[lei][ii]=0;
}
}
}
/////////////////////////一维模式B的///////////////////////////
if(juleimoshi==3)
{
mincount_b=Min(bd,leishu);
for(lei=0;lei<leishu;lei++)
{
if(lei==mincount_b)
{
bdt[lei][ii]=1;
}
if(lei!=mincount_b)
{
bdt[lei][ii]=0;
}
}
}
/////////////////////////二维模式RG的///////////////////////////
if(juleimoshi==4)
{
mincount_rg=Min(dis_rg,leishu);
for(lei=0;lei<leishu;lei++)
{
if(lei==mincount_rg)
{
gdt[lei][ii]=1;
rdt[lei][ii]=1;
}
if(lei!=mincount_rg)
{
gdt[lei][ii]=0;
rdt[lei][ii]=0;
}
}
}
/////////////////////////二维模式RB的///////////////////////////
if(juleimoshi==5)
{
mincount_rb=Min(dis_rb,leishu);
for(lei=0;lei<leishu;lei++)
{
if(lei==mincount_rb)
{
bdt[lei][ii]=1;
rdt[lei][ii]=1;
}
if(lei!=mincount_rb)
{
bdt[lei][ii]=0;
rdt[lei][ii]=0;
}
}
}
/////////////////////////二维模式BG的///////////////////////////
if(juleimoshi==6)
{
mincount_bg=Min(dis_bg,leishu);
for(lei=0;lei<leishu;lei++)
{
if(lei==mincount_bg)
{
gdt[lei][ii]=1;
bdt[lei][ii]=1;
}
if(lei!=mincount_bg)
{
gdt[lei][ii]=0;
bdt[lei][ii]=0;
}
}
}
////////////////////////////////////////////////////////////////
ii++;
}
}
//Check(leishu);
GatherPintRGB(leishu);
/////////////////逐类K平均判断//////////////////////////////
for(int lei=0;lei<leishu;lei++)
{
a=0;
b=0;
c=0;
ChargeAndGive(lei);
ShowRGB(0, 0, 0, lei,2);//循环显示
//////////求平均值RGB的//////////////////////////
if(leineiyangbengeshu!=0)
{
for(i=0;i<wide;i++)
{
for(j=0;j<hieght;j++)
{
a=a+gdata1[i][j];
b=b+rdata1[i][j];
c=c+bdata1[i][j];
}
}
a=a/leineiyangbengeshu;
b=b/leineiyangbengeshu;
c=c/leineiyangbengeshu;
///////////////////////////////////////////////
rgb1[lei].R=b;
rgb1[lei].G=a;
rgb1[lei].B=c;
}
if(leineiyangbengeshu==0)
{
b=rgb1[lei].R;
a=rgb1[lei].G;
c=rgb1[lei].B;
}
///////////////////判断点是否移动////////////////////
if(a!=rgbGther[lei].G||b!=rgbGther[lei].R||c!=rgbGther[lei].B)
{
WetherMove(lei,cishu+1);
}
///////////////////////////////////////////////////
/////////////////画曲线图///////////////////////////
PintCenterPoint(rgb1,rgbGther,leishu,lei);
////////////根据新求得的平均值与原来的中心点相减和域值比较大小//////////
//////////////三维模式的聚类///////////////////////
if(leineiyangbengeshu!=0)
{
if(juleimoshi==7)
{
if(sqrt(pow(a-rgbGther[lei].G,2)+pow(b-rgbGther[lei].R,2)+pow(c-rgbGther[lei].B,2))>=yuzhi)
{
rgbGther[lei].G=a;
rgbGther[lei].R=b;
rgbGther[lei].B=c;
}
//else
// break;
}
//////////////二维模式/////////////////////////////
if(juleimoshi==4)
{
if(sqrt(pow(a-rgbGther[lei].G,2)+pow(b-rgbGther[lei].R,2))>=yuzhi)
{
rgbGther[lei].G=a;
rgbGther[lei].R=b;
}
// else
// break;
}
if(juleimoshi==6)
{
if(sqrt(pow(a-rgbGther[lei].G,2)+pow(c-rgbGther[lei].B,2))>=yuzhi)
{
rgbGther[lei].G=a;
rgbGther[lei].B=c;
}
//else
// break;
}
if(juleimoshi==5)
{
if(sqrt(pow(b-rgbGther[lei].R,2)+pow(c-rgbGther[lei].B,2))>=yuzhi)
{
rgbGther[lei].R=b;
rgbGther[lei].B=c;
}
// else
// break;
}
/////////////////////////////////一维模式/////////////////////////////
if(juleimoshi==2)
{
if(fabs(a-rgbGther[lei].G)>=yuzhi)
{
rgbGther[lei].G=a;
}
// else
// break;
}
if(juleimoshi==1)
{
if(fabs(b-rgbGther[lei].R)>=yuzhi)
{
rgbGther[lei].R=b;
}
//if(fabs(b-rgbGther[lei].R)<yuzhi)
// break;
}
if(juleimoshi==3)
{
if(fabs(c-rgbGther[lei].B)>=yuzhi)
{
rgbGther[lei].B=c;
}
//else
// break;
}
}
}
cishu++;
}
////////////////绘图部分/////////////////////
//Check(leishu);
MessageBox("完成聚类!!");
}
/*void CGatherDlg::OnButton3()
{
// TODO: Add your control notification handler code here
dian=1;
kuang=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -