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 bool Sprawdź2Modalność(int[] tb, int C, float PoziomRystrykcji = 1, float WielkośćZbioru = 0.20f) { int A, B; Otsu.ZnajdywanieRóźnicyŚrednichZProgiem(C, tb, out A, out B); return(Sprawdź2Modalność(A, C, B, tb, PoziomRystrykcji, WielkośćZbioru)); }
internal unsafe static ProstokątNaObrazie PobierzNaPodstawieCzestotliwosci(Bitmap zmiejszony, bool Odwrotnosc) { byte *obraz = ZmieńPoCzestotliwosciach(zmiejszony); Otsu.Progój(Odwrotnosc, zmiejszony.Size.WielkoścWPix(), obraz); var a = NaPodtawieMonohromatyka(zmiejszony, obraz); return(a); }
unsafe private void otwórzToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { działajToolStripMenuItem.Enabled = true; Dana = new Bitmap(openFileDialog1.FileName); //Dana = new Bitmap(new Bitmap(openFileDialog1.FileName), 3264, 2448); bool *c = Otsu.OtsuGlobalneNaTablice(OperacjeNaStrumieniu.PonierzMonohormatyczny(Dana), new Size(Dana.Width, Dana.Height)); pictureBox1.Image = new Bitmap(WstepnePrzygotowanie.WskaźnikNaObraz(c, Dana.Width, Dana.Height), new Size(1000, 1000)); } }
public static void WyrównajHistogram(byte *b, Size rozmar) { int[] histWejście = Otsu.PobierzHistogram(rozmar, b); int Wartość = histWejście.Sum() / DługośćHistogramu; int[] histWyjscie = new int[DługośćHistogramu]; for (int i = 0; i < DługośćHistogramu; i++) { histWyjscie[i] = Wartość; } ZastosujPalete(b, rozmar, WyznaczPelteOdPoczątku(histWejście, histWyjscie)); }
private static void PobierzTabele(int[,] tabelaProgów, int ZmianaProgu, Size rozmiar, byte *obraz) { int RóżnicaŚredniej = Otsu.ZnajdywanieRóźnicyŚrednich(obraz, rozmiar) + ZmianaProgu; int x = tabelaProgów.GetLength(1), y = tabelaProgów.GetLength(0); int[] histogram = new int[256]; int MinmalnyPoziomProgu = (int)(RóżnicaŚredniej * MinimalnyPoziomProguFloat) + ZmianaProgu; int[,] tabhist = new int[x, y]; int DzielnikiX = rozmiar.Width / x; int DzielnikiY = rozmiar.Height / y; DzielnikiX += rozmiar.Width % DzielnikiX != 0 ? 1 : 0; DzielnikiY += rozmiar.Height % DzielnikiY != 0 ? 1 : 0; for (int i = 0; i < y; i++) { for (int j = 0; j < x; j++) { histogram = new int[256]; for (int ix = 0; ix < DzielnikiY; ix++) { byte *Miejsce = obraz + rozmiar.Width * (i * DzielnikiY + ix) + j * DzielnikiX; if (i * DzielnikiY + ix >= rozmiar.Height) { break; } for (int jx = 0; jx < DzielnikiX; jx++, Miejsce++) { if (j * DzielnikiX + jx >= rozmiar.Width) { break; } histogram[*Miejsce]++; } } int A, B, S; int Wartość = Otsu.ZnajdywanieRóźnicyŚrednich(histogram, out A, out S, out B) + ZmianaProgu; if (Wartość < MinmalnyPoziomProgu) { Wartość = MinmalnyPoziomProgu; } if (!Sprawdź2Modalność(A, S, B, histogram)) { Wartość = RóżnicaŚredniej; } tabelaProgów[i, j] = Wartość; } } }
internal unsafe static ProstokątNaObrazie WyrównianieŚwiatła(Bitmap zmiejszony, bool Odwrotnosc) { WyrównywanieObrazu wb = new WyrównywanieObrazu(); wb.Naładuj(zmiejszony, zmiejszony.Size.Skaluj(0.5f)); byte *obraz = wb.ZamianaWMonohromatyczny(zmiejszony); Otsu.Progój(Odwrotnosc, zmiejszony.Size.WielkoścWPix(), obraz); var a = NaPodtawieMonohromatyka(zmiejszony, obraz); return(a); }
private unsafe void BadajLinike(int *mapaSpójnychObszarów, Size samLoto, bool *obrazKopis, List <ZdjecieZPozycją> listaZdjęć, int item) { var Rzut = PobierzRzutX(obrazKopis, new Rectangle(0, item - PrzypószczalnaWysokość, samLoto.Width, PrzypószczalnaWysokość), samLoto.Width); int Próg = ProgowanieGradientowe.ProgójTablice(Rzut, Rzut.Length); bool[] SprogowaneY = Otsu.ProgójTablice(Rzut, Próg); int[] SumaWRzędach = SumaBool(SprogowaneY, PrzypószczalnaWysokość); var Ekrema = ZnajdźEktremaNajwieksze(SumaWRzędach, PrzypuszczalnaSzerokość * 0); UsuńStycznePoWartościach(SumaWRzędach, Ekrema, PrzypuszczalnaSzerokość); foreach (var item2 in Ekrema) { ZbudujLitere(item - PrzypószczalnaWysokość, item2 - PrzypuszczalnaSzerokość, mapaSpójnychObszarów, samLoto); } }
public static unsafe bool *ProgójGradientowo(byte *Wejście, Size Rozmiar, bool Odwrotność = false) { int X = Rozmiar.Width; int Y = Rozmiar.Height; long Suma = 0, SumaWag = 0; int XP = X + 1; byte *PoczątekDziałania = Wejście + XP; int IlośćPentli = Rozmiar.Width * Rozmiar.Height; IlośćPentli -= XP * 2; for (int i = 0; i < IlośćPentli; i++, PoczątekDziałania++) { int RóżnicaX = PoczątekDziałania[-1] - PoczątekDziałania[1], RóźnicaY = PoczątekDziałania[-X] - PoczątekDziałania[X]; RóżnicaX = RóżnicaX < 0 ? -RóżnicaX : RóżnicaX; RóźnicaY = RóźnicaY < 0 ? -RóźnicaY : RóźnicaY; int Waga = RóźnicaY < RóżnicaX ? RóżnicaX : RóźnicaY; Suma += Waga * *PoczątekDziałania; SumaWag += Waga; } Suma /= SumaWag; return(Otsu.Progój(Odwrotność, X * Y, (int)Suma, Wejście)); }
private unsafe void testoweToolStripMenuItem_Click(object sender, EventArgs e) { FolderBrowserDialog fsb = new FolderBrowserDialog(); if (fsb.ShowDialog() == DialogResult.OK) { DirectoryInfo ds = new DirectoryInfo(fsb.SelectedPath); FileInfo[] fi = ds.GetFiles("*.jpg"); if (fsb.ShowDialog() == DialogResult.OK) { for (int i = 0; i < fi.Length; i++) { Bitmap f = new Bitmap(fi[i].FullName); f = new Bitmap(f, f.Size.Skaluj((float)1 / RozpoznawanieKuponu.StopieńZmiejszenia)); byte *Mon = OperacjeNaStrumieniu.PonierzMonohormatyczny(f); bool *Bin = ProgowanieAdaptacyjne.ProgowanieZRamką(Mon, f.Size, Otsu.ZnajdywanieRóźnicyŚrednich(Mon, f.Size), 6, -20, true); int * Mapa; //var Obszary= WstepnePrzygotowanie.ZnajdźOpszary(ref Bin, f.Size.Width, f.Size.Height,out Mapa); //Obszary.Sort(); //var Najwiekszy = Obszary[0]; //Zw = WstepnePrzygotowanie.PobierzObszar(Bin, Najwiekszy.Miejsce, f.Size); f = WstepnePrzygotowanie.WskaźnikNaObraz(Bin, f.Size); f.Save(fsb.SelectedPath + "\\" + i.ToString() + "zap.bmp"); //Marshal.FreeHGlobal((IntPtr)Zw); Marshal.FreeHGlobal((IntPtr)Bin); GC.Collect(); } } } }