} // GetPixelValue /// <summary> /// Реализация определения степени корреляции между устойчивыми блоками реперных характеристик, каждый из которых соответствует одному пикселю, /// основанная на разнице яркостей соответствующих точек сравниваемых растров. /// </summary> /// <param name="affinityBlock1">Один из блоков реперных характеристик (пиксель), между которыми определяется степень корреляции.</param> /// <param name="affinityBlock2">Второй из блоков реперных характеристик (пиксель), между которыми определяется степень корреляции.</param> /// <returns>Степень корреляции между блоками реперных характеристик (пикселями): /// 0 - корреляция отсутствует, /// 1 - полная корреляция. /// Чем ближе значение к 1, тем корреляция полнее. /// </returns> protected override Correlation DefaultAffinityBlockCorrelator(IAffinityBlock affinityBlock1, IAffinityBlock affinityBlock2) { PixelCoordsKey key = (PixelCoordsKey)affinityBlock1.Key; if ((key.X == 0) && (key.Y == 0)) { BackgroundBase = new double[] { (double)affinityBlock1.Value - 0.1, (double)affinityBlock1.Value + 0.1 } } ; double e1 = (double)affinityBlock1.Value; double e2 = (double)affinityBlock2.Value; double importance; double affinity; if ((BackgroundBase != null) && (BackgroundBase[0] <= e1) && (e1 <= BackgroundBase[1])) { // Попали по первому определяющему растру в фон. Попадание в фон дает наименьшую степень значимости в корреляции сравниваемых блоков. affinity = 0; importance = 0; } else if ((BackgroundBase[0] <= e2) && (e2 <= BackgroundBase[1])) { // Попали в фон по второму растру, а по первому определяющему попали не в фон. Полное отсутствие корреляции. affinity = 0; importance = 1; } else { // В обоих растрах попали не в фон. Такие блоки рассматриваем, как определяющие. affinity = 1 - Math.Abs(e1 - e2); importance = 1; } return(new Correlation(affinity, importance)); } // DefaultAffinityBlockCorrelator } // class EDiffRasterAffinityDetector
} // PixelCoordsKey public override bool Equals(object obj) { bool result = false; if (obj is PixelCoordsKey) { PixelCoordsKey value = (PixelCoordsKey)obj; result = X.Equals(value.X) && Y.Equals(value.Y); } return(result); } // Equals