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); }
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(); }
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); } }
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); }
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); }