private double[] GetBackgroundHistogram(ObjectLayer layer, GrayscaleProcessor p)
        {
            Map map = new Map(p.Width, p.Height);

            for (int dy = 0; dy < p.Height; dy++)
            {
                for (int dx = 0; dx < p.Width; dx++)
                {
                    if (layer.Map[dx, dy] == 0)
                    {
                        map[dx, dy] = 1;
                    }
                }
            }

            double[,] distanceMap = new DistanceTransformation().Execute(map);

            double[] histogram = new double[256];

            for (int dy = 0; dy < p.Height; dy++)
            {
                for (int dx = 0; dx < p.Width; dx++)
                {
                    if (map[dx, dy] == 0)
                    {
                        continue;
                    }

                    if (distanceMap[dx, dy] < 3)
                    {
                        continue;
                    }

                    histogram[p[dx, dy]]++;
                }
            }

            return(histogram);
        }
        private double[] GetBackgroundHistogram(ObjectLayer layer, GrayscaleProcessor p)
        {
            Map map = new Map(p.Width, p.Height);

              for (int dy = 0; dy < p.Height; dy++) for (int dx = 0; dx < p.Width; dx++)
            {
              if (layer.Map[dx, dy] == 0) map[dx, dy] = 1;
            }

              double[,] distanceMap = new DistanceTransformation().Execute(map);

              double[] histogram = new double[256];

              for (int dy = 0; dy < p.Height; dy++) for (int dx = 0; dx < p.Width; dx++)
            {
              if (map[dx, dy] == 0) continue;

              if (distanceMap[dx, dy] < 3) continue;

              histogram[p[dx, dy]]++;
            }

              return histogram;
        }
        private void Connect(int min_dist, int char_width, int[] labels, int label_width, int label_height)
        {
            int                    char_count = _char_list.Count;
            int                    mw = _bbx.Width + 2; int mh = _bbx.Height + 2;// 1 pixel border
            List <int[, ]>         charimg_list      = new List <int[, ]>();
            List <int[, ]>         dist_charimg_list = new List <int[, ]>();
            DistanceTransformation dist              = new DistanceTransformation();

            for (int i = 0; i < char_count; i++)
            {
                int[,] charimg = new int[mh, mw];
                for (int xx = 1; xx < mw - 1; xx++)
                {
                    for (int yy = 1; yy < mh - 1; yy++)
                    {
                        if (labels[(yy - 1 + _bbx.Y) * label_width + (xx - 1 + _bbx.X)] == _char_list[i].pixel_id)
                        {
                            charimg[yy, xx] = 1; // 1 is fg
                        }
                        else
                        {
                            charimg[yy, xx] = 0;
                        }
                    }
                }
                charimg_list.Add(charimg);
                dist_charimg_list.Add(dist.ApplyFGisZero(charimg));
            }
            for (int i = 0; i < char_count; i++)
            {
                for (int j = i + 1; j < char_count; j++)
                {
                    int min = mw * mh;
                    for (int yy = 1; yy < mh - 1; yy++)
                    {
                        int[,] charimg = charimg_list[i];
                        for (int xx = 1; xx < mw - 1; xx++)
                        {
                            int[,] dist_charimg = dist_charimg_list[j];
                            if (charimg[yy, xx] == 1 && min > dist_charimg[yy, xx])
                            {
                                min = dist_charimg[yy, xx];
                            }
                        }
                    }
                    if (min <= min_dist)
                    {
                        if ((!_char_list[j].sizefilter_included && !_char_list[i].sizefilter_included) || //S S
                            (_char_list[j].sizefilter_included && _char_list[i].sizefilter_included))
                        {
                            _char_list[i].neighbors.Add(j);
                            _char_list[i].neighbor_count++;

                            _char_list[j].neighbors.Add(i);
                            _char_list[j].neighbor_count++;
                        }
                        else
                        {
                            if (!_char_list[i].sizefilter_included) // S B
                            {
                                _char_list[i].neighbors.Add(j);
                                _char_list[i].neighbor_count++;
                            }
                            else
                            {
                                _char_list[j].neighbors.Add(i);
                                _char_list[j].neighbor_count++;
                            }
                        }
                    }
                }
            }
        }