/// <summary>
        /// Filters the candidate points. Only the candidates that has a certain amount of possible candidates in the neighborhood area are kept.
        /// </summary>
        private static List <int> FilterCandidates(DisjointSet disjointSet)
        {
            var setRepresentatives = new List <int>();

            for (int i = 0; i < disjointSet.Count; i++)
            {
                int setRepresentative = disjointSet.Find(i);
                if (!setRepresentatives.Contains(setRepresentative) && disjointSet.SetSize(setRepresentative) > Thresholds.HaarCandidateMinCount)
                {
                    setRepresentatives.Add(setRepresentative);
                }
            }

            var highestCandidates = new List <int>();

            foreach (var representative in setRepresentatives)
            {
                highestCandidates.Add(disjointSet.HighestIndexInTree[representative]);
            }

            return(highestCandidates);
        }
        /// <summary>
        /// Filters the candidate points. Only the candidates that has a certain amount of possible candidates in the neighborhood area are kept.
        /// </summary>
        private static List<int> FilterCandidates(DisjointSet disjointSet)
        {
            var setRepresentatives = new List<int>();

            for (int i = 0; i < disjointSet.Count; i++)
            {
                int setRepresentative = disjointSet.Find(i);
                if (!setRepresentatives.Contains(setRepresentative) && disjointSet.SetSize(setRepresentative) > Thresholds.HaarCandidateMinCount)
                {
                    setRepresentatives.Add(setRepresentative);
                }
            }

            var highestCandidates = new List<int>();

            foreach (var representative in setRepresentatives)
            {
                highestCandidates.Add(disjointSet.HighestIndexInTree[representative]);
            }

            return highestCandidates;
        }