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