Ejemplo n.º 1
0
        // 画像を必要ならば反転させ、二値化処理を行う
        private static Bitmap BinarizeBitmap(Bitmap bitmap, int threshold, bool inverseFlg)
        {
            var mat1 = BitmapToMonoArray(bitmap);
            var mat2 = new bitmapArray();

            if (inverseFlg)
            {
                foreach (byte data in mat1)
                {
                    if (255 - data >= threshold)
                    {
                        mat2.Add(255);
                    }
                    else
                    {
                        mat2.Add(0);
                    }
                }
            }
            else
            {
                foreach (byte data in mat1)
                {
                    if (data >= threshold)
                    {
                        mat2.Add(255);
                    }
                    else
                    {
                        mat2.Add(0);
                    }
                }
            }
            return(ArrayToBitmap(mat2, bitmap.Width, bitmap.Height));
        }
Ejemplo n.º 2
0
        // 画像を配列化する
        // 参考→
        //  https://dobon.net/vb/dotnet/graphics/drawnegativeimage.html#lockbits
        //  http://blueclouds.blog.so-net.ne.jp/2011-04-29
        private static bitmapArray BitmapToMonoArray(Bitmap bitmap)
        {
            var bmpArr     = new bitmapArray();
            var bitmapData = bitmap.LockBits(
                new Rectangle(Point.Empty, bitmap.Size),
                System.Drawing.Imaging.ImageLockMode.ReadOnly,
                System.Drawing.Imaging.PixelFormat.Format32bppArgb
                );
            //ピクセルデータをバイト型配列で取得する
            var pointer = bitmapData.Scan0;

            byte[] pixels = new byte[bitmapData.Stride * bitmap.Height];
            System.Runtime.InteropServices.Marshal.Copy(pointer, pixels, 0, pixels.Length);
            //すべてのピクセルのデータを取得する
            for (int y = 0; y < bitmapData.Height; ++y)
            {
                for (int x = 0; x < bitmapData.Width; ++x)
                {
                    //ピクセルデータでのピクセル(x,y)の開始位置を計算する
                    int  pos       = y * bitmapData.Stride + x * 4;
                    byte b         = pixels[pos];
                    byte g         = pixels[pos + 1];
                    byte r         = pixels[pos + 2];
                    byte a         = pixels[pos + 3];
                    byte grayColor = (byte)(0.299 * r + 0.587 * g + 0.114 * b);
                    bmpArr.Add(grayColor);
                    continue;
                }
            }
            bitmap.UnlockBits(bitmapData);
            return(bmpArr);
        }
Ejemplo n.º 3
0
        // 差分を計算する
        private static ulong CalcArrayDiff(bitmapArray a, bitmapArray b)
        {
            ulong diff = 0;

            for (int i = 0; i < a.Count; ++i)
            {
                int c = a[i] - b[i];
                diff += (ulong)(c * c);
            }
            return(diff);
        }
Ejemplo n.º 4
0
        // bitmapArrayを画像化する
        private static Bitmap ArrayToBitmap(bitmapArray bitmapArray, int width, int height)
        {
            var output = new Bitmap(width, height);

            for (int y = 0; y < height; ++y)
            {
                for (int x = 0; x < width; ++x)
                {
                    byte grayScale = bitmapArray[x + y * width];
                    output.SetPixel(x, y, Color.FromArgb(grayScale, grayScale, grayScale));
                }
            }
            return(output);
        }