- Visual C++數(shù)字圖像模式識別典型案例詳解
- 馮偉興 梁洪 王臣業(yè)編著
- 697字
- 2018-12-31 19:39:05
4.4.3 模糊聚類
編程實(shí)現(xiàn)
[1] 在類CCluster中添加函數(shù)FuzzyCluster(),進(jìn)行有關(guān)圖像的模糊聚類。具體實(shí)現(xiàn)代碼如代碼4-4所示。
代碼4-4 FuzzyCluster()函數(shù)
void CCluster::FuzzyCluster() { GetFeature(); //獲得所有樣品特征 double *dis, *tempdis; double dismax; int i,j; int distype; dismax=0; dis=new double [patternnum*patternnum]; //模糊系數(shù)矩陣 tempdis=new double [patternnum*patternnum]; return; distype=julizl; //此處為聲明模糊距離的總類 //得到初始模糊距離 for ( i=0; i<patternnum; i++) for (j=0; j<patternnum; j++) { dis[i*patternnum+j]=GetFuzzyDistance(m_pattern[i],m_pattern[j], distype);//distype } //構(gòu)造等價類 bool flag; flag=true; while (flag) { flag=false; for ( i=0; i<patternnum; i++) for ( j=0; j<patternnum; j++) if (i==j)//對角線為1 tempdis[i*patternnum+j]=1; else tempdis[i*patternnum+j]=GetDistance(dis,i,j); for ( i=0; i<patternnum; i++) { for ( j=0; j<patternnum; j++) if ((tempdis[i*patternnum+j]-dis[i*patternnum+j])*(tempdis [i*patternnum+j]-dis[i*patternnum+j])>0.000001)//(tdis[i][j]!=dis[i][j]) { flag=true; break; } if (flag) break; } for ( i=0; i<patternnum*patternnum; i++) dis[i]=tempdis[i]; } //輸出模糊矩陣 CString ts,sout; //第一行標(biāo)號1,2, …, patternnum sout.Insert(sout.GetLength()," \t"); for (i=1; i<=patternnum; i++) { ts.Format("%d \t",i); sout.Insert(sout.GetLength(),ts); } sout.Insert(sout.GetLength(),"\n\n"); for (i=0; i<patternnum; i++) { //每列開頭標(biāo)號 ts.Format("%d \t",i+1); sout.Insert(sout.GetLength(),ts); //輸出模糊系數(shù)矩陣 for(j=0; j<patternnum; j++) { ts.Format("%0.3f\t",dis[i*patternnum+j]); sout.Insert(sout.GetLength(),ts); if ((j+1)%patternnum==0) sout.Insert(sout.GetLength(),"\n\n\n"); } } MessageBox(NULL, sout, "模糊矩陣", MB_OK); delete []tempdis; double *xishu=new double [patternnum*patternnum]; for(i=0; i<patternnum*patternnum; i++) xishu[i]=-1; int pointer=0; //記錄模糊系數(shù)矩陣中不同的系數(shù) for ( i=0; i<patternnum; i++) for ( j=i; j<patternnum; j++) { bool done=false; for (int k=0; k<pointer; k++) { if ((xishu[k]-dis[i*patternnum+j])*(xishu[k]-dis[i*patternnum+j])<0.000001) { done=true; break; } } if (!done) { xishu[pointer]=dis[i*patternnum+j]; pointer++; } } for(i=0; i<pointer-1; i++)//對閾值由小到大排序 for (j=0; j<pointer-i-1; j++) { if (xishu[j]>xishu[j+1]) { double temp=xishu[j]; xishu[j]=xishu[j+1]; xishu[j+1]=temp; } } CString s,str; for (i=0; i<pointer; i++) { s.Format("%0.4f ",xishu[i]); str.Insert(str.GetLength(),s); } delete []xishu; //用戶輸入聚類閾值 double yz; DLGmohu1 mohu; mohu.m_Mohuxishu=str; if (mohu.DoModal()==IDOK) { yz=mohu.m_Mohuyuzhi; } else return; int *result; //根據(jù)閾值輸出聚類結(jié)果 result=new int [patternnum*patternnum]; for (i=0; i<patternnum*patternnum; i++) if (dis[i]>=yz) result[i]=1; else result[i]=0; //分類后輸出 //第一行標(biāo)號 sout=""; sout.Insert(-1, "每行中\"1\"對應(yīng)的列為同一類"); sout.Insert(sout.GetLength(),"\n\n"); sout.Insert(sout.GetLength()," \t"); for (i=1; i<=patternnum; i++) { ts.Format("%d \t",i); sout.Insert(sout.GetLength(),ts); } sout.Insert(sout.GetLength(),"\n\n"); for (i=0; i<patternnum; i++) { //每列開頭標(biāo)號 ts.Format("%d \t",i+1); sout.Insert(sout.GetLength(),ts); for(j=0; j<patternnum; j++)//首行為原模糊系數(shù) { ts.Format("%0.3f\t",dis[i*patternnum+j]); sout.Insert(sout.GetLength(),ts); if ((j+1)%patternnum==0) sout.Insert(sout.GetLength(),"\n"); } sout.Insert(sout.GetLength()," \t"); for(j=0; j<patternnum; j++)//次行為根據(jù)閾值修改后的系數(shù)“1”或“0” { ts.Format("%d\t",result[i*patternnum+j]); sout.Insert(sout.GetLength(),ts); if ((j+1)%patternnum==0) sout.Insert(sout.GetLength(),"\n\n"); } } MessageBox(NULL, sout, "分類前后的矩陣對照", MB_OK); centernum=0; for (i=0; i<patternnum; i++)//按照閾值分類 for (j=i; j<patternnum; j++) { if (result[i*patternnum+j]==1) { if (m_pattern[i].category!=0) m_pattern[j].category=m_pattern[i].category; else if (m_pattern[j].category!=0) m_pattern[i].category=m_pattern[j].category; else { centernum++; m_pattern[j].category=centernum; m_pattern[i].category=centernum; } } } delete []dis; delete []result; } void CCluster::huasz(int p,int q,int t) { int tmp;tmp=p; p=q;q=tmp;/////////////////////////////////////////////// int i,j; for(i=0;i<16;i++) for(j=0;j<16;j++) *(m_pData+(height-(i+p))*wide+j+q)=sz[t][(15-i)*16+j]*255; }
[2] 上述代碼中,GetDistance ()函數(shù)用于返回模糊距離數(shù)組中第i行第j列的模糊積,該函數(shù)的實(shí)現(xiàn)代碼如代碼4-5所示。
代碼4-5 GetDistance ()函數(shù)
double CCluster::GetDistance(double *dis, int i, int j) { double result; result=0; for(int t=0;t<patternnum;t++) { double td=dis[i*patternnum+t]<dis[t*patternnum+j]? dis[i*patternnum+t]:dis[t*patternnum+j]; if (result<td) result=td; } return result; }
推薦閱讀
- 高校第二課堂思想政治工作載體創(chuàng)新研究
- 西南大學(xué)數(shù)學(xué)與統(tǒng)計學(xué)院432統(tǒng)計學(xué)[專業(yè)碩士]歷年考研真題及詳解
- 基礎(chǔ)英語寫作
- 翻譯認(rèn)識與提升
- 新聞學(xué)概論(廣東省特色專業(yè)系列教材)
- 汽車構(gòu)造(第3版)
- 供應(yīng)鏈管理
- 市場營銷實(shí)訓(xùn)
- 廣告設(shè)計與創(chuàng)意表現(xiàn)(第2版·微課版)
- 新交互大學(xué)英語2
- 復(fù)雜動力網(wǎng)絡(luò)的同步分析與控制
- 韓德培《國際私法》(第2版)【教材精講+考研真題解析】講義與視頻課程【32小時高清視頻】
- 基礎(chǔ)會計教程
- 從實(shí)踐中學(xué)ARM體系結(jié)構(gòu)與接口技術(shù)
- 中山大學(xué)中國語言文學(xué)系805漢語語言學(xué)基礎(chǔ)歷年考研真題及詳解