예제 #1
0
        /// <summary>
        /// Строит на основе графа лес минимальных остовных деревьев, каждое из которых представляет сегмент изображения.
        /// </summary>
        /// <param name="edges">Набор ребер, представляющих исходный граф.</param>
        /// <param name="edgesCount">Число ребер в графе.</param>
        /// <param name="numVerticies">Число вершин в графе.</param>
        /// <returns>Система непересекающихся множеств, каждое из которых представляет собой сегмент изображения.</returns>
        private DisjointSet SegmentGraph(Edge[] edges, int edgesCount, int numVerticies)
        {
            QuickSort(edges, 0, edgesCount - 1);

            DisjointSet disjointSet = new DisjointSet(numVerticies);

            //значение пороговой функции изначально дано для каждой вершины
            double[] thresholdValues = new double[numVerticies];
            for (int i = 0; i < numVerticies; i++)
            {
                thresholdValues[i] = ThresholdFunction(1);
            }

            for (int i = 0; i < edgesCount; i++)
            {
                //найти представителей сегментов, которые соединяются этим ребром
                int a = disjointSet.Find(edges[i].A);
                int b = disjointSet.Find(edges[i].B);

                if (a != b)
                {
                    if (edges[i].W <= thresholdValues[a] && edges[i].W <= thresholdValues[b])
                    {
                        disjointSet.Joint(a, b);
                        a = disjointSet.Find(a);
                        thresholdValues[a] = edges[i].W + ThresholdFunction(disjointSet.Size(a));
                    }
                }
            }

            return(disjointSet);
        }
예제 #2
0
 /// <summary>
 /// Объединяет маленькие сегменты.
 /// </summary>
 /// <param name="disjointSet">Система непересекающихся множеств, представляющая сегменты.</param>
 /// <param name="edges">Массив всех ребер изображения.</param>
 /// <param name="count">Число всех ребер изображения.</param>
 private void JointSmallSegments(DisjointSet disjointSet, Edge[] edges, int edgesCount)
 {
     for (int i = 0; i < edgesCount; i++)
     {
         int a = disjointSet.Find(edges[i].A);
         int b = disjointSet.Find(edges[i].B);
         if (a != b && (disjointSet.Size(a) < MinSize || disjointSet.Size(b) < MinSize))
         {
             disjointSet.Joint(a, b);
         }
     }
 }