public static unsafe byte *PrzeklorujMapkę(Bitmap b, int L2DoSklaliUjemnej, out Size Wielkość, int IlośćKolorów, int[] filtr)
        {
            int SzerokośćNowego = b.Width >> L2DoSklaliUjemnej;
            int WysokośćNowego  = b.Height >> L2DoSklaliUjemnej;
            int Skaler          = 1 << L2DoSklaliUjemnej;

            Wielkość = new Size(SzerokośćNowego, WysokośćNowego);
            IntPtr     ip        = Marshal.AllocHGlobal(SzerokośćNowego * WysokośćNowego);
            float      Rdzielnik = 0.299f * (IlośćKolorów - 1); Rdzielnik /= 255;
            float      GDzielnik = 0.587f * (IlośćKolorów - 1); GDzielnik /= 255;
            float      BDzielnik = 0.114f * (IlośćKolorów - 1); BDzielnik /= 255;
            float      OdwrotnośćIlościKolorów = 255f / (IlośćKolorów - 1);
            BitmapData bd = b.LockBits(new Rectangle(0, 0, b.Width & ~3, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

            for (int j = 0; j < WysokośćNowego; j++)
            {
                for (int i = 0; i < SzerokośćNowego; i++)
                {
                    byte *  Mapa      = (byte *)ip + j * SzerokośćNowego + i;
                    short[] Histogram = new short[IlośćKolorów];//Uważaj na obszary wieksze od 16x16
                    for (int jx = 0; jx < Skaler; jx++)
                    {
                        RGB *KolorNaWejsciu = (RGB *)(((byte *)bd.Scan0) + bd.Stride * (Skaler * j));
                        KolorNaWejsciu += i * Skaler;
                        for (int ix = 0; ix < Skaler; ix++, KolorNaWejsciu++)
                        {
                            float f   = KolorNaWejsciu->R * Rdzielnik + KolorNaWejsciu->G * GDzielnik + BDzielnik * KolorNaWejsciu->B;
                            int   ind = Convert.ToInt32(f);
                            Histogram[ind]++;
                        }
                    }
                    int Wartość = Filtry.FiltrZnajdźNajwyszyPunkt(Histogram, filtr);
                    *   Mapa    = Convert.ToByte(Wartość * OdwrotnośćIlościKolorów);
                }
            }
            b.UnlockBits(bd);
            return((byte *)ip);
        }
Exemplo n.º 2
0
        unsafe public static bool *OtsuGlobalneNaTablice(byte *mr, Size Wielkość, bool CzyWykrywaćKrawedzie = true, bool Odwrotność = false)
        {
            int[] histogram = new int[256];


            byte *obsugiwana = (byte *)mr;

            Filtry.FiltrMedianowyOcenaZaszumienia(Wielkość, obsugiwana);
            //WykryjKrawedzie(obsugiwana, Obraz, histogram);
            if (CzyWykrywaćKrawedzie)
            {
                WykryjKrawedzie(Wielkość, obsugiwana, histogram);
            }
            else
            {
                PobierzHistogram(Wielkość, obsugiwana, histogram);
            }
            int   WielkośćObrazu  = Wielkość.Width * Wielkość.Height;
            int   WartośćProgu    = MetodaOtsu(histogram);
            byte *ObrazZprogowany = (byte *)mr;

            return(Progój(Odwrotność, WielkośćObrazu, WartośćProgu, ObrazZprogowany));
        }