Beispiel #1
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
        }
Beispiel #2
0
        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);
        }
Beispiel #4
0
 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));
     }
 }
Beispiel #5
0
        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));
        }
Beispiel #6
0
        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);
        }
Beispiel #8
0
        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);
            }
        }
Beispiel #9
0
        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));
        }
Beispiel #10
0
        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();
                    }
                }
            }
        }