Я написал следующий код 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;
}
}
Результат:
Такое же изображение загружается в двух графических блоков.
Значение их коэффициента корреляции стало, -1
.
Это правильный результат?
Если нет, что мне делать, чтобы исправить ошибку?
Насколько я могу видеть в окончательной формуле для '' numerator' и denominator' вы должны разделить by 'n' - количество точек - это' Высота * Ширина', а не только 'Высота' –
Было бы очень полезно, если бы вы могли предоставить нам ссылку на формулу, которую вы используете. Однако я считаю, что результат должен быть равен 1, поскольку оба изображения одинаковы. Более того, поскольку знаменатель всегда положителен, должно быть что-то не так с числителем. – Mahdi
@Mahdi, https://github.com/cureos/aforge/blob/master/Sources/Math/Metrics/PearsonCorrelation.cs – anonymous