示例#1
0
        private unsafe List <ZdjecieZPozycją> ZnajdźNoweObszary(bool *c, SiecNeuronowa.ISiećNeuronowa <string> sieć, Size Wielkość)
        {
            List <ZdjecieZPozycją> z = new List <ZdjecieZPozycją>();

            foreach (var item in ZnalezioneObszary)
            {
                if (item.Count > 0)
                {
                    List <ZdjecieZPozycją> Lisr = new List <ZdjecieZPozycją>();

                    foreach (var item2 in item)
                    {
                        ZdjecieZPozycją zpi;
                        if (ObsógaMapyObszarów.TryGetValue(item2.NarKwadratu, out zpi))
                        {
                            Lisr.Add(zpi);
                        }
                    }
                    if (Lisr.Count > 0)
                    {
                        ZdjecieZPozycją zp = new ZdjecieZPozycją();
                        zp.Obszar = DoKwadratów.StwórzKwadratZawierającyWiele(Lisr.ToArray());
                        zp.ObliczPodobieństwo(c, Wielkość.Width, sieć);
                        zp.Moc = Lisr.Sum(x => x.Moc);
                        z.Add(zp);
                    }
                }
            }
            return(z);
        }
示例#2
0
        private unsafe void SpróbojRozdzielić(ZdjecieZPozycją item, bool *mapa, int szerokość, List <ZdjecieZPozycją> dododania, HashSet <ZdjecieZPozycją> doUsuniecia, bool DziałanieKrytyczne)
        {
            SpróbujWypalić(item, mapa, szerokość);
            if (item.Obszar.Width < 1 || item.Obszar.Height < 1 || item.Obszar.Height > 5000)
            {
                return;
            }
            int[]  ŻutAksonomiczny  = ZlepianieLiterRzutami.PobierzRzutX(mapa, item.Obszar, szerokość);
            int    Miejsce          = 0;
            double Min              = int.MaxValue;
            int    SzerokośćObiektu = item.Obszar.Width;

            for (int i = 0; i < SzerokośćObiektu; i++)
            {
                double x  = ŻutAksonomiczny[i];
                double Zm = i + 0.5f;
                Zm /= SzerokośćObiektu;
                double K = (1 - Zm) * Zm;
                Zm = K * K;
                x /= Zm;
                if (Min > x)
                {
                    Min     = x;
                    Miejsce = i;
                }
            }
            ZdjecieZPozycją a = new ZdjecieZPozycją();

            a.Obszar = new Rectangle(item.Obszar.X, item.Obszar.Y, Miejsce - ZminiejszenieWielkości, item.Obszar.Height);
            //a.ObrazWBool = (bool*)(GrafyShp.Icer.OperacjeNaStrumieniu.KopiujFragment(mapa, new Size(szerokość, 0), a.Obszar));
            a.ObliczPodobieństwo(mapa, szerokość, sieć);
            ZdjecieZPozycją b = new ZdjecieZPozycją();

            b.Obszar = new Rectangle(item.Obszar.X + Miejsce + ZminiejszenieWielkości, item.Obszar.Y, item.Obszar.Width - Miejsce - ZminiejszenieWielkości, item.Obszar.Height);

            b.ObliczPodobieństwo(mapa, szerokość, sieć);
            item.ObliczPodobieństwo(mapa, szerokość, sieć);
            int   IlorazRozmiarów = a.Obszar.Size.WielkoścWPix() * b.Obszar.Size.WielkoścWPix();
            float Współczynik     = ((a.NajbliszePodobieństwo + b.NajbliszePodobieństwo) / 2) / (item.NajbliszePodobieństwo + 0.000001f);

            if (DziałanieKrytyczne)
            {
                Współczynik *= Matematyka.Podobność(item.Obszar.Width, Próg);//podobność zawsze(0,1)
            }
            if ((Współczynik < 1 && IlorazRozmiarów > (ZminiejszenieWielkości * ZminiejszenieWielkości)))
            {
                dododania.Add(a);
                dododania.Add(b);
                doUsuniecia.Add(item);
            }
        }
        public ZdjecieZPozycją PobierzZdjecie(List <int> Zloczone)
        {
            ListaZPorównywaniem <int> l = new ListaZPorównywaniem <int>(Zloczone);

            if (DzienikZnalezionych.ContainsKey(l))
            {
                return(DzienikZnalezionych[l]);
            }
            else
            {
                ZdjecieZPozycją z = new ZdjecieZPozycją();
                z.Obszar   = DoKwadratów.StwórzKwadratZawierającyWiele(PobierzZdjeciaPoIndeksach(Zloczone));
                z.Skeljona = Zloczone.Count > 1;
                z.ObliczPodobieństwo(Obraz, Szerokośc, Sieć);
                DzienikZnalezionych.Add(l, z);
                return(z);
            }
        }
示例#4
0
        private static void ObszaryNaZdzieciaZPozycją(ref bool *c, Size SamLoto, bool *ObrazKopis, List <ZdjecieZPozycją> ListaZdjęć, out ZdjecieZPozycją Logo, bool UżywajZlepianiaRzutem)
        {
            Logo = null;
            int * MapaSpójnychObszarów;
            float NajbardzjeLogowaty = 0;

            List <WstepnePrzygotowanie.ObiektNaMapie> Obszary = WstepnePrzygotowanie.ZnajdźOpszary(ref c, SamLoto.Width, SamLoto.Height, out MapaSpójnychObszarów);

            foreach (var item in Obszary)
            {
                Rectangle       rl = new Rectangle(item.MinX, item.MinY, item.MaxX - item.MinX + 1, item.MaxY - item.MinY + 1);
                ZdjecieZPozycją z  = new ZdjecieZPozycją();
                z.Obszar        = rl;
                z.Moc           = item.Moc;
                z.ObiektNaMapie = item;
                z.ObliczPodobieństwo(c, SamLoto.Width, Sieć);
                //usóń w dalszej fazie i Usń też Kopie
                z.ObrazWBool = WstepnePrzygotowanie.PobierzObszar(ObrazKopis, z, SamLoto.Width, SamLoto.Height);
                if (SprawdźPoprawne(item))
                {
                    ListaZdjęć.Add(z);
                }
                float Logowatość = ObliczLogowatość(z);
                if (Logowatość > NajbardzjeLogowaty)
                {
                    NajbardzjeLogowaty = Logowatość;
                    Logo = z;
                }
            }
            WczytajParametry(Logo);
            if (UżywajZlepianiaRzutem)
            {
                ZlepianieLiterRzutami zlk = new ZlepianieLiterRzutami(ŚredniaSzerokość, ŚredniaWysokość);
                zlk.Zlepiaj(MapaSpójnychObszarów, Sieć, SamLoto, c, ListaZdjęć);
            }


            Marshal.FreeHGlobal((IntPtr)MapaSpójnychObszarów);
        }
示例#5
0
        public void Scal()
        {
            List <ZdjecieZPozycją>    DoDodania   = new List <ZdjecieZPozycją>();
            HashSet <ZdjecieZPozycją> DoUsuniecia = new HashSet <ZdjecieZPozycją>();

            while (w.Count != 0)
            {
                WystepująceWTymSamymMiejscu ostatni = w.Last();
                if (ostatni.Count == 1)
                {
                    w.RemoveAt(w.Count - 1);
                    continue;
                }

                ZdjecieZPozycją z = new ZdjecieZPozycją();
                z.Obszar = DoKwadratów.StwórzKwadratZawierającyWiele(ostatni.ToArray());
                z.ObszarInterpolowany = DoKwadratów.StwórzKwadratZawierającyWieleRec(WeźInterpolowany(ostatni));
                z.Skeljona            = true;
                z.ObliczPodobieństwo(Obraz, Szerokość, sieć);
                if (PrógDoUsuniecia + z.NajbliszePodobieństwo < ostatni.Podobność)
                {
                    foreach (var item in ostatni)
                    {
                        DoUsuniecia.Add(item);
                    }
                    w.RemoveAll(X => X.Kolizja(ostatni));
                    DoDodania.Add(z);
                }
                else
                {
                    w.RemoveAt(w.Count - 1);
                }
            }

            LinikaZmieniana.ListaZZdjeciami.RemoveAll(X => DoUsuniecia.Contains(X));
            LinikaZmieniana.ListaZZdjeciami.AddRange(DoDodania);
            LinikaZmieniana.ListaZZdjeciami.Sort(new DoKwadratów.SortowanieWzgledemX());
        }