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); }
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); }
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]]; }
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 }
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); }
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); }
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); }
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); }
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); } }
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; } } } }
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); }
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--; } } }
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); }
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); }
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 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ą); }
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; } } } } }
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)); }
public float Styczność(Linika l) { int Wielkość = Max - Min; return(((float)Matematyka.Styczność2Obiektów(Min, Max, l.Min, l.Max)) / Wielkość); }