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;
            }
        }