/// <summary>
        /// Calculates features map. First orientations are quantized, the stable ones are selected and then they are spread.
        /// </summary>
        /// <param name="orientationDegImg">Orientation map. Each location represents angle in degrees [0..360].</param>
        /// <param name="spreadNeigborhood">Spreading neighborhood. If 1 no spreading is done.</param>
        /// <param name="minSameOrientations">Minimal number of the same orientations in [3 x 3] neighborhood to proclaim the orientation stable.</param>
        /// <returns>Feature map.</returns>
        public static Gray <byte>[,] Calculate(Gray <int>[,] orientationDegImg, int spreadNeigborhood, int minSameOrientations = 4)
        {
            Gray <byte>[,] quantizedOrient          = FeatureMap.QuantizeOrientations(orientationDegImg);
            Gray <byte>[,] importantQuantizedOrient = FeatureMap.RetainImportantQuantizedOrientations(quantizedOrient, minSameOrientations);

            Gray <byte>[,] sprededQuantizedOrient = importantQuantizedOrient;
            if (spreadNeigborhood > 1)
            {
                sprededQuantizedOrient = FeatureMap.SpreadOrientations(importantQuantizedOrient, spreadNeigborhood);
            }

            return(sprededQuantizedOrient);
        }
        /// <summary>
        /// Calculates features map. First orientations are quantized, the stable ones are selected and then they are spread.
        /// </summary>
        /// <param name="orientationDegImg">Orientation map. Each location represents angle in degrees [0..360].</param>
        /// <param name="spreadNeigborhood">Spreading neighborhood. If 1 no spreading is done.</param>
        /// <param name="minSameOrientations">Minimal number of the same orientations in [3 x 3] neighborhood to proclaim the orientation stable.</param>
        /// <returns>Feature map.</returns>
        public static Image <Gray, byte> Calculate(Image <Gray, int> orientationDegImg, int spreadNeigborhood, int minSameOrientations = 4)
        {
            Image <Gray, Byte> quantizedOrient          = FeatureMap.QuantizeOrientations(orientationDegImg);
            Image <Gray, Byte> importantQuantizedOrient = FeatureMap.RetainImportantQuantizedOrientations(quantizedOrient, minSameOrientations);

            Image <Gray, Byte> sprededQuantizedOrient = importantQuantizedOrient;

            if (spreadNeigborhood > 1)
            {
                sprededQuantizedOrient = FeatureMap.SpreadOrientations(importantQuantizedOrient, spreadNeigborhood);
            }

            return(sprededQuantizedOrient);
        }
        /// <summary>
        /// Calculates features map. First orientations are quantized, the stable ones are selected and then they are spread.
        /// </summary>
        /// <param name="orientationDegImg">Orientation map. Each location represents angle in degrees [0..360].</param>
        /// <param name="spreadNeigborhood">Spreading neighborhood. If 1 no spreading is done.</param>
        /// <param name="minSameOrientations">Minimal number of the same orientations in [3 x 3] neighborhood to proclaim the orientation stable.</param>
        /// <returns>Feature map.</returns>
        public static Gray <byte>[,] Calculate(Gray <int>[,] orientationDegImg, int spreadNeigborhood, int minSameOrientations = 4)
        {
            //Quantinize the orientationIMG [ 1..360 --> 0..7 ]
            Gray <byte>[,] quantizedOrient = FeatureMap.QuantizeOrientations(orientationDegImg);
            // Convert the neightbor to 8-bit number [ correspond to Image J in the paper] [0..7 --> 1,2,4,8,,,128]
            Gray <byte>[,] importantQuantizedOrient = FeatureMap.RetainImportantQuantizedOrientations(quantizedOrient, minSameOrientations);

            Gray <byte>[,] sprededQuantizedOrient = importantQuantizedOrient;
            if (spreadNeigborhood > 1)
            {
                sprededQuantizedOrient = FeatureMap.SpreadOrientations(importantQuantizedOrient, spreadNeigborhood);
            }

            return(sprededQuantizedOrient);
        }