- Visual C++数字图像模式识别典型案例详解
- 冯伟兴 梁洪 王臣业编著
- 299字
- 2025-03-16 03:50:42
4.4.2 计算模糊距离
编程实现
在类CCluster中添加函数GetFuzzyDistance (),进行有关图像的模糊距离的计算。具体实现代码如代码4-3所示。
代码4-3 GetFuzzyDistance ()函数
double CCluster::GetFuzzyDistance(CCluster::Pattern pattern1,CCluster::Pattern pattern2, int distype) { switch (distype) { case 1://欧氏距离 { double max=0; for (int i=0; i<patternnum-1; i++) for (int j=i+1; j<patternnum; j++) if (max<GetDistance(m_pattern[i],m_pattern[j],1)) max=GetDistance(m_pattern[i],m_pattern[j],1); return (max-GetDistance(pattern1,pattern2,1))/max; } case 2://数量积 { double temp,max; max=0; for (int i=0; i<patternnum-1; i++) for (int j=0; j<patternnum; j++) { temp=0; for (int k=0; k<N*N; k++) { temp+=m_pattern[i].feature[k]*m_pattern[j].feature[k]; } if (max<temp) max=temp; } temp=0; for ( i=0; i<N*N; i++) { temp+=pattern1.feature[i]*pattern2.feature[i]; } return (temp/max); } case 3://相关系数 { double ap1,ap2; ap1=0;ap2=0; for (int i=0; i<N*N; i++) { ap1+=pattern1.feature[i]; ap2+=pattern2.feature[i]; } ap1/=N; ap1/=N; double a,b1,b2; a=0;b1=0;b2=0; for (i=0; i<N*N; i++) { a+=(pattern1.feature[i]-ap1)*(pattern2.feature[i]-ap2); b1+=(pattern1.feature[i]-ap1)*(pattern1.feature[i]-ap1); b2+=(pattern2.feature[i]-ap2)*(pattern2.feature[i]-ap2); } if (b2*b1!=0) return (a/sqrt(b1*b2)); } case 4://最大最小法 { double min ,max; min=0; max=0; for (int i=0; i<N*N; i++) { min+=pattern1.feature[i]<pattern2.feature[i]? pattern1.feature[i]:pattern2.feature[i]; max+=pattern1.feature[i]<pattern2.feature[i]? pattern2.feature[i]:pattern1.feature[i]; } if (max!=0) return (min/max); } case 5://算数平均法 { double min ,max; min=0; max=0; for (int i=0; i<N*N; i++) { min+=pattern1.feature[i]<pattern2.feature[i]? pattern1.feature[i]:pattern2.feature[i]; max+=pattern1.feature[i]+pattern2.feature[i]; } if (max!=0) return (2*min/max); } case 6://几何平均最小法 { double min ,max; min=0; max=0; for (int i=0; i<N*N; i++) { min+=pattern1.feature[i]<pattern2.feature[i]? pattern1.feature[i]:pattern2.feature[i]; max+=sqrt(pattern1.feature[i]*pattern2.feature[i]); } if (max!=0) return (min/max); } default: return -1; } }