Esempio n. 1
0
        private List <ZdjecieZPozycją> ZnajdźBliskoSiebie()
        {
            Graf <ZdjecieZPozycją> o = new Graf <ZdjecieZPozycją>();

            o.UstalWielkośćGrafu(ListaZZdjeciami.Count, ListaZZdjeciami.ToArray());
            for (int i = 0; i < ListaZZdjeciami.Count; i++)
            {
                for (int j = i + 1; j < ListaZZdjeciami.Count; j++)
                {
                    Rectangle a = ListaZZdjeciami[i].Obszar;
                    Rectangle b = ListaZZdjeciami[j].Obszar;
                    if (Matematyka.Styczność2Obiektów(a.Left, a.Right, b.Left, b.Right) > MaxymalnaDopuszczalnaOdległość || Matematyka.Podobność(a.Height, b.Height) > MinimalnePodobieństwoY)
                    {
                        o.PołączenieDwustrone(ListaZZdjeciami[i], ListaZZdjeciami[j]);
                    }
                }
            }

            int Najwieksze           = 0;
            List <ZdjecieZPozycją> z = null;

            foreach (List <ZdjecieZPozycją> item in o.ZnajdźObszary())
            {
                if (item.Count > Najwieksze)
                {
                    Najwieksze = item.Count;
                    z          = item;
                }
            }

            return(z);
        }
Esempio n. 2
0
        public bool Sąsiedztwo(ZdjecieZPozycją zp)
        {
            int X = Matematyka.Styczność2Obiektów(Obszar.X, Obszar.X + Obszar.Width, zp.Obszar.X, zp.Obszar.X + zp.Obszar.Width);
            int Y = Matematyka.Styczność2Obiektów(Obszar.Y, Obszar.Y + Obszar.Height, zp.Obszar.Y, zp.Obszar.Y + zp.Obszar.Height);

            return(X > NajbliszaOdległośćSąsiada && Y > NajbliszaOdległośćSąsiada);
        }
Esempio n. 3
0
        public void Ustaw(Size w)
        {
            Point[] Krawedzie = { Point.Empty, new Point()
                                  {
                                      X = w.Width
                                  },           new Point{
                                      Y = w.Height
                                  },           (Point)w };
            Point[] Obiekty   = { XNYN, XPYP, XNYP, XPYN };
            int[]   TabZamian = null;
            float   Odległość = float.MaxValue;

            foreach (var item in Matematyka.WarjancjaJakaśTam(4, 4))
            {
                float Odl = 0;
                for (int i = 0; i < item.Length; i++)
                {
                    float D = Obiekty[item[i]].Odległość(Krawedzie[i]);
                    Odl += D * D;
                }
                if (Odległość > Odl)
                {
                    Odległość = Odl;
                    TabZamian = (int[])item.Clone();
                }
            }

            TabZamian = Matematyka.Odwrotnośc(TabZamian);
            //Zmiejsz(Obiekty);
            XNYN = Obiekty[TabZamian[0]];
            XPYN = Obiekty[TabZamian[1]];
            XNYP = Obiekty[TabZamian[2]];
            XPYP = Obiekty[TabZamian[3]];
        }
Esempio n. 4
0
        internal unsafe void Zlepiaj(int *mapaSpójnychObszarów, SiecNeuronowa.ISiećNeuronowa <string> sieć, Size samLoto, bool *obrazKopis, List <ZdjecieZPozycją> listaZdjęć)
        {
            ZaładujObszary(listaZdjęć);
            var    Rzuty  = PobierzRzutY(obrazKopis, new Rectangle(Point.Empty, samLoto), samLoto.Width);
            double Skaler = 255; Skaler /= Rzuty.Max();
            int    Próg   = (int)(ProgowanieGradientowe.ProgójTablice(Rzuty, (int)(samLoto.Height * SkalerByPominąćKrańce)) * SkalerRóznicyNajkrutszyOdNajduszychLinijek);

            bool[] SprogowaneY = Otsu.ProgójTablice(Rzuty, Próg);
            if (!ProgowanieAdaptacyjne.Sprawdź2Modalność(Otsu.PobierzHistogram256(Matematyka.SkalujTablice(Rzuty, Skaler)), (int)(Skaler * Próg), 1.2f))
            {
                return;
            }
            int[] SumaWRzędach = SumaBool(SprogowaneY, PrzypószczalnaWysokość);
            var   Ekrema       = ZnajdźEktremaNajwieksze(SumaWRzędach, PrzypószczalnaWysokość / 2);

            UsuńStycznePoPierszeństwie(Ekrema, PrzypószczalnaWysokość);
#if DEBUG
            ZapiszLinikiY(samLoto, obrazKopis, SprogowaneY, new HashSet <int>(Ekrema), SumaWRzędach);
#endif
            foreach (var item in Ekrema)
            {
                BadajLinike(mapaSpójnychObszarów, samLoto, obrazKopis, listaZdjęć, item);
            }

            DecydujOPrzynależności();
            List <ZdjecieZPozycją>    Dodawane           = ZnajdźNoweObszary(obrazKopis, sieć, samLoto);
            HashSet <ZdjecieZPozycją> ObszaryDoUsuniecia = ZnajdźDoUsuniecia();
            listaZdjęć.RemoveAll(x => ObszaryDoUsuniecia.Contains(x));
            Dodawane.ForEach(x => x.ZlepionaRzutami = true);
            listaZdjęć.AddRange(Dodawane);
#if DEBUG
            ZlepianieRzutami(samLoto, obrazKopis, Dodawane);
#endif
        }
Esempio n. 5
0
        public static Rectangle StwórzKwadratZawierającyWiele <T>(IEnumerable <T> A) where T : WeźKwadrat
        {
            Rectangle Zawierający = A.First().PobierzKwadrat();

            foreach (var item in A)
            {
                Zawierający = Matematyka.StwórzKwadratZawierający(Zawierający, item.PobierzKwadrat());
            }
            return(Zawierający);
        }
Esempio n. 6
0
        public static Rectangle StwórzKwadratZawierającyWieleRec(IEnumerable <Rectangle> t)
        {
            Rectangle Zawierający = t.First();

            foreach (var item in t)
            {
                Zawierający = Matematyka.StwórzKwadratZawierający(Zawierający, item);
            }
            return(Zawierający);
        }
Esempio n. 7
0
        public static Rectangle StwórzKwadratZawierającyWiele <T>(params T[] A) where T : WeźKwadrat
        {
            Rectangle Zawierający = A[0].PobierzKwadrat();

            for (int i = 1; i < A.Length; i++)
            {
                Zawierający = Matematyka.StwórzKwadratZawierający(Zawierający, A[i].PobierzKwadrat());
            }
            return(Zawierający);
        }
Esempio n. 8
0
        public bool SprawdźPodobieństwo(Linika a)
        {
            int   WielkośćTego    = RóżnicaŚrednich();
            int   WielkośćTamtego = a.RóżnicaŚrednich();
            int   MniejszaRóźnica = WielkośćTamtego < WielkośćTego ? WielkośćTamtego : WielkośćTego;
            float fx = Matematyka.Styczność2Obiektów(SredniPoczątekY, SredniKoniecY, a.SredniPoczątekY, a.SredniKoniecY);

            fx /= MniejszaRóźnica;
            return(MinPodobieństwoLinijek < fx);
        }
        public static float SprawdźOceneKątami(ProstokątNaObrazie pk)
        {
            float f = Matematyka.Podobność(Matematyka.ObliczKąt(pk.XPYP, pk.XNYP, pk.XNYN), Matematyka.ObliczKąt(pk.XNYP, pk.XPYP, pk.XPYN)) * Matematyka.Podobność(Matematyka.ObliczKąt(pk.XNYP, pk.XNYN, pk.XPYN), Matematyka.ObliczKąt(pk.XPYP, pk.XPYN, pk.XNYN));

            if (float.IsInfinity(f) || float.IsNaN(f))
            {
                return(0);
            }
            return(f * f);
        }
Esempio n. 10
0
        private void ZlepiajLitere(Graf <int> item)
        {
            List <int> P1, P2;
            float      ŚredniaWielkość = ObliczŚredniąWIelkość(item);

            item.ZnajdźPołączenia(out P1, out P2);
            if (P1.Count > 6)
            {
                return;
            }
            int   IlośćMożlwiości        = 1 << P1.Count;
            int   Stan                   = IlośćMożlwiości - 1;
            float NajwiekszePodobieństwo = int.MaxValue;
            List <ZdjecieZPozycją> NajlepiejDopasowane = new List <ZdjecieZPozycją>();

            for (int i = 0; i < IlośćMożlwiości; i++)
            {
                UstawGraf(P1, P2, Stan, i, item);
                item.CzyśćZaznaczenia();
                List <ZdjecieZPozycją> z = new List <ZdjecieZPozycją>();
                foreach (var SpójneObszary in item.ZnajdźObszary())
                {
                    z.Add(PobierzZdjecie(SpójneObszary));
                }
                double Podobieństwo;
                if (ŚredniaWielkość == 0)
                {
                    Podobieństwo = z.Average(d => d.NajbliszePodobieństwo);
                }
                else
                {
                    Podobieństwo = z.Average(d => d.NajbliszePodobieństwo / Matematyka.Podobność(ŚredniaWielkość, d.Obszar.Wielkośc()));
                }
                if (Podobieństwo < NajwiekszePodobieństwo)
                {
                    NajwiekszePodobieństwo = (float)Podobieństwo;
                    NajlepiejDopasowane    = z;
                }



                Stan = i;
            }
            foreach (var item2 in item.Listuj())
            {
                PaczkaGrafu pk = PaczkiDoGrafu[item2];
                pk.LinikaDoKrótrejNajlerzy.ListaZZdjeciami.Remove(pk.zp);
            }
            foreach (var item2 in NajlepiejDopasowane)
            {
                Liniki[0].Add(item2);
                item2.IlośćSąsiadów = item.Wielkość - 1;
            }
            item.Zaznacz();
        }
Esempio n. 11
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);
            }
        }
Esempio n. 12
0
 public void UsuńStycznePoPierszeństwie(List <int> Ekrema, int OdległośćUsuniecia)
 {
     for (int i = 0; i < Ekrema.Count; i++)
     {
         for (int j = i + 1; j < Ekrema.Count; j++)
         {
             if (Matematyka.Styczność2Obiektów(Ekrema[i], Ekrema[i] + OdległośćUsuniecia, Ekrema[j], Ekrema[j] + OdległośćUsuniecia) > -1)
             {
                 Ekrema.RemoveAt(i--);//ponieważ jest wcześniejszy
                 break;
             }
         }
     }
 }
Esempio n. 13
0
        public float WynaczPodobieństwo(LinikaWzgledna lk)
        {
            float PodobieństwoLinijek = 0;
            int   MinWPetli           = 0;

            foreach (var item in CześciLinijek)
            {
                float MaksymalnePodobieństwo = 0;
                //foreach (var item2 in lk.CześciLinijek)
                //{
                //    if (item.SymbolePasujące.Contains(item2.Pierwszy()))
                //    {
                //        float Podobieństwo = Matematyka.Podobieństwo(item2.ZajmowanyObszar, item.ZajmowanyObszar);
                //        if (Podobieństwo > MaksymalnePodobieństwo) MaksymalnePodobieństwo = Podobieństwo;
                //    }
                //}
                for (int i = MinWPetli; i < lk.CześciLinijek.Count; i++)
                {
                    ObszarWzgledny item2 = lk.CześciLinijek[i];
                    if (item.ZajmowanyObszar.X > item2.ZajmowanyObszar.Right)
                    {
                        MinWPetli = i + 1;
                        continue;
                    }
                    if (item.ZajmowanyObszar.Right < item2.ZajmowanyObszar.X)
                    {
                        break;
                    }
                    if (item.SprawdźSybol(item2.Pierwszy()))
                    {
                        float Podobieństwo = Matematyka.Podobieństwo(item2.ZajmowanyObszar, item.ZajmowanyObszar);
#if DEBUG
                        if (Podobieństwo > 1)
                        {
                            throw new NotImplementedException("podobieństwo jest zbyt wielkie");
                        }
#endif
                        if (Podobieństwo > MaksymalnePodobieństwo)
                        {
                            MaksymalnePodobieństwo = Podobieństwo;
                        }
                    }
                }
                PodobieństwoLinijek += MaksymalnePodobieństwo;
            }

            return(PodobieństwoLinijek);
        }
Esempio n. 14
0
        public static void UsuńOdbiegająceWielkością <T>(this List <T> lk, float WspółczynikUsuniecia) where T : WeźKwadrat
        {
            Size Rozmiar = SortowanieWielkości <T> .ŚredniaWielkośćSrednichWartości(lk);

            int X = Rozmiar.Width, Y = Rozmiar.Height;

            for (int i = 0; i < lk.Count; i++)
            {
                Rectangle r       = lk[i].PobierzKwadrat();
                float     Różnica = Matematyka.RóżnicaWielkośći(X, r.Width) * Matematyka.RóżnicaWielkośći(Y, r.Height);
                if (Różnica < WspółczynikUsuniecia)
                {
                    lk.RemoveAt(i);
                    i--;
                }
            }
        }
Esempio n. 15
0
            public void SpróbujDodać(ZdjecieZPozycją z)
            {
                foreach (var item in this)
                {
                    if (Matematyka.Styczność2Obiektów(item.Obszar.X, item.Obszar.Right, z.Obszar.X, z.Obszar.Right) < PrógPodobności)
                    {
                        return;
                    }
                }
                int PrógZTego = (int)(MinimalnaPodobność * z.Obszar.Width);

                if (PrógPodobności < PrógZTego)
                {
                    PrógPodobności = PrógZTego;
                }
                SumaPodobności += z.NajbliszePodobieństwo;
                Add(z);
            }
Esempio n. 16
0
        public byte *ZamianaWMonohromatyczny(Bitmap b)
        {
            byte *z = OperacjeNaStrumieniu.PonierzMonohormatyczny(b);

            if (MnożnikY == null || b.Width == MnożnikX.Length && b.Height == MnożnikY.Length)
            {
                if (MnożnikX == null)
                {
                    Naładuj(z, b.Size);
                }

                Zastosuj(z, MnożnikX, MnożnikY);
            }
            else
            {
                Zastosuj(z, Matematyka.RozciągnijTablice(MnożnikY, b.Height), Matematyka.RozciągnijTablice(MnożnikX, b.Width));
            }
            return(z);
        }
Esempio n. 17
0
        private static float ObliczLogowatość(ZdjecieZPozycją z)
        {
            float X = z.Obszar.Width, Y = z.Obszar.Height;
            float zw = X * Y;
            float Min, Max;

            if (X < Y)
            {
                Min = X;
                Max = Y;
            }
            else
            {
                Min = Y;
                Max = X;
            }
            zw *= Min / Max;

            zw *= Matematyka.Podobność(WypełnienieLoga, z.Wypełninienie()) * Matematyka.Podobność(z.Obszar.Size.WielkoścWPix(), SkalerLoga);
            return(zw);
        }
Esempio n. 18
0
        private static List <Linika> PrzydzielanieDoLinik(List <ZdjecieZPozycją> ListaZdjęć, int PrógMimalnejOdległośc, bool PodobieństwoInterpolowane = false)
        {
            ListaZdjęć.Sort(new DoKwadratów.SortowanieWzgledemX());
            List <Linika> ZwracanePrzedPrzemianą = new List <Linika>();

            foreach (var item in ListaZdjęć)
            {
                int   Index = -1;
                float NajbardziejPodobny = float.MinValue;
                for (int i = 0; i < ZwracanePrzedPrzemianą.Count; i++)
                {
                    ZdjecieZPozycją Ostanij      = ZwracanePrzedPrzemianą[i].Last();
                    float           Podobieństwo = 0;
                    if (PodobieństwoInterpolowane)
                    {
                        Podobieństwo = Matematyka.PodobieństwoYProstokontów(Ostanij.ObszarInterpolowany, item.ObszarInterpolowany);
                    }
                    else
                    {
                        Podobieństwo = Matematyka.PodobieństwoYProstokontów(Ostanij.Obszar, item.Obszar);
                    }
                    if (Podobieństwo > NajbardziejPodobny && item.Obszar.X - Ostanij.Obszar.X < PrógMimalnejOdległośc)
                    {
                        Index = i;
                        NajbardziejPodobny = Podobieństwo;
                    }
                }
                if (NajbardziejPodobny > MinimalnePodobieństwo)
                {
                    ZwracanePrzedPrzemianą[Index].Add(item);
                }
                else
                {
                    ZwracanePrzedPrzemianą.Add(new Linika());
                    ZwracanePrzedPrzemianą.Last().Add(item);
                }
            }

            return(ZwracanePrzedPrzemianą);
        }
Esempio n. 19
0
 public void UsuńStycznePoWartościach(int[] Tb, List <int> Ekrema, int OdległośćUsuniecia)
 {
     for (int i = 0; i < Ekrema.Count; i++)
     {
         for (int j = i + 1; j < Ekrema.Count; j++)
         {
             if (Matematyka.Styczność2Obiektów(Ekrema[i], Ekrema[i] + OdległośćUsuniecia, Ekrema[j], Ekrema[j] + OdległośćUsuniecia) > -1)
             {
                 if (Tb[i] < Tb[j])
                 {
                     Ekrema.RemoveAt(i--);//ponieważ jest wcześniejszy
                     break;
                 }
                 else
                 {
                     Ekrema.RemoveAt(j--);
                     continue;
                 }
             }
         }
     }
 }
Esempio n. 20
0
        public void UsuńSzum()
        {
            float  SredniaWielkoścPróg            = ŚredniaWIelkość() * WielkośćSzumu;
            double WielkośćY                      = ListaZZdjeciami.Average(X => X.Obszar.Height) * WielkośćSzumuY;
            HashSet <ZdjecieZPozycją> DoUsuniecia = new HashSet <ZdjecieZPozycją>();

            foreach (var item in ListaZZdjeciami)
            {
                if (item.Obszar.Height < WielkośćY && SredniaWielkoścPróg > item.Obszar.Wielkośc())
                {
                    foreach (var item2 in ListaZZdjeciami)
                    {
                        if (item != item2 && Matematyka.Styczność2Obiektów(item.Obszar.Left, item.Obszar.Right, item2.Obszar.Left, item.Obszar.Right) > OdalenieDoUsuniecia)
                        {
                            goto Ko;
                        }
                    }
                    DoUsuniecia.Add(item);
                    Ko :;
                }
            }
            ListaZZdjeciami.RemoveAll(X => DoUsuniecia.Contains(X));
        }
Esempio n. 21
0
        public float Styczność(Linika l)
        {
            int Wielkość = Max - Min;

            return(((float)Matematyka.Styczność2Obiektów(Min, Max, l.Min, l.Max)) / Wielkość);
        }