2016-08-17 14 views
0

2つの画像間のピアソン相関係数を見つけるために次のC#コードを書いています。完全なソースコードはhere in the DotNetFiddleです。ピアソン相関係数

相関ソースコード:

public sealed class PearsonCorrelation 
{ 
    public static double GetSimilarityScore(double[,] p, double[,] q) 
    { 
     int Width = p.GetLength(0); 
     int Height = p.GetLength(1); 

     if (Width != q.GetLength(0) || Height != q.GetLength(1)) 
     { 
      throw new ArgumentException("Input vectors must be of the same dimension."); 
     } 

     double pSum = 0, qSum = 0, pSumSq = 0, qSumSq = 0, productSum = 0; 
     double pValue, qValue; 

     for (int y = 0; y < Height; y++) 
     { 
      for (int x = 0; x < Width; x++) 
      { 
       pValue = p[y, x]; 
       qValue = q[y, x]; 

       pSum += pValue; 
       qSum += qValue; 
       pSumSq += pValue * pValue; 
       qSumSq += qValue * qValue; 
       productSum += pValue * qValue; 
      } 
     } 

     double numerator = productSum - ((pSum * qSum)/(double)Height); 
     double denominator = Math.Sqrt((pSumSq - (pSum * pSum)/(double)Height) * (qSumSq - (qSum * qSum)/(double)Height)); 

     return (denominator == 0) ? 0 : numerator/denominator; 
    } 
} 

結果:

enter image description here

同じ画像を2つの画像ボックスにロードされます。

これらの相関係数の値は、-1となりました。

これが正しい結果ですか?

いいえの場合は、修正するために何をすべきですか?

+1

を参照してください置く必要があります'n' - 点数 - Heightだけでなく' Height * Width'です –

+0

あなたが使用している数式への参照を私たちに提供できるなら、非常に役に立ちます。しかし、2つの画像が同じなので結果は1でなければならないと私は信じています。さらに、分母は常に正であるため、分子に何か問題があるはずです。 – Mahdi

+0

@Mahdi、https://github.com/cureos/aforge/blob/master/Sources/Math/Metrics/PearsonCorrelation.cs – anonymous

答えて

1

同一の配列の相関が

でなければなりませんあなたのルーチンの最後に問題を抱えているようです。代わりに

double numerator = productSum - ((pSum * qSum)/(double)Height); 
double denominator = Math.Sqrt((pSumSq - (pSum * pSum)/(double)Height) * (qSumSq - (qSum * qSum)/(double)Height)); 

のあなたは

double n = ((double) Width) * Height; 

double numerator = productSum - ((pSum * qSum)/n); 
double denominator = 
    Math.Sqrt((pSumSq - (pSum * pSum)/n) * (qSumSq - (qSum * qSum)/n)); 

はあなたが分割すべきdenominator`私は `` numerator`のために、最終的な式で見ることができ限り

https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient

+0

他のトラブルのために私のフィドルコードを検査しましたか? – anonymous

+0

@anonymous:実行しませんでした: 'using System.Windows.Forms;'は実行されないようです –

+0

Fiddleは 'WinForms'と' unsafe'コードを実行するメカニズムを持っていません。 – anonymous