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