图像简单处理

时间:2022-07-24
本文章向大家介绍图像简单处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
public class ImageDistinguish
    {
        public string imgName { get; set;}
        private Bitmap bitmap { get; set; }
        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="img">包含二维码的发票</param>
        public ImageDistinguish(Bitmap img)
        {
            this.bitmap = img;
        }
        /// <summary>
        /// 构造图像识别
        /// </summary>
        /// <param name="img">包含二维码的发票</param>
        public ImageDistinguish(string path)
        {
            this.bitmap = new Bitmap(path);
            this.imgName = path;
        }
        /// <summary>
        /// 截图,只截取(0,0)到(400,400)位置的图片,包含了二维码了
        /// </summary>
        /// <returns></returns>
        public ImageDistinguish ScreenShot()
        {
            Bitmap destBitmap = new Bitmap(400, 400);//目标图
            Rectangle destRect = new Rectangle(0, 0, 400, 400);//矩形容器
            Rectangle srcRect = new Rectangle(0, 0, 400, 400);
            Graphics gh = Graphics.FromImage(destBitmap);
            gh.DrawImage(this.bitmap, destRect, srcRect, GraphicsUnit.Pixel);
            this.bitmap = destBitmap;
            return this;
        }
        /// <summary>
        /// 二值化处理
        /// </summary>
        /// <returns></returns>
        public ImageDistinguish TwoValued()
        {
            for (int i = 0; i < this.bitmap.Width; i++)
            {
                for (int j = 0; j < this.bitmap.Height; j++)
                {
                    Color pixelColor = this.bitmap.GetPixel(i, j);
                    if (pixelColor.R < 127.5 || pixelColor.G < 127.5 && pixelColor.B < 127.5)
                    {
                        this.bitmap.SetPixel(i, j, Color.FromArgb(0, 0, 0));
                    }
                    else
                    {
                        this.bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));
                    }
                }
            }
            return this;
        }
        public ImageDistinguish TwoValued(int Level)
        {
            if (Level < 0)
            {
                Level = 0;
            }
            if (Level > 10)
            {
                Level = 10;
            }
            for (int i = 0; i < this.bitmap.Width; i++)
            {
                for (int j = 0; j < this.bitmap.Height; j++)
                {
                    Color pixelColor = this.bitmap.GetPixel(i, j);
                    if (pixelColor.R < Level*20 || pixelColor.G < Level * 20 && pixelColor.B < Level * 20)
                    {
                        this.bitmap.SetPixel(i, j, Color.FromArgb(0, 0, 0));
                    }
                    else
                    {
                        this.bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));
                    }
                }
            }
            return this;
        }
        /// <summary>
        /// 柔化处理
        /// </summary>
        /// <returns></returns>
        public ImageDistinguish SoftenImage()
        {
            int height = this.bitmap.Height;
            int width = this.bitmap.Width;
            Bitmap newbmp = new Bitmap(width, height);
            LockBitmap lbmp = new LockBitmap(this.bitmap);
            LockBitmap newlbmp = new LockBitmap(newbmp);
            lbmp.LockBits();
            newlbmp.LockBits();

            Color pixel;
            //高斯模板
            int[] Gauss = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
            for (int x = 1; x < width - 1; x++)
            {
                for (int y = 1; y < height - 1; y++)
                {
                    int r = 0, g = 0, b = 0;
                    int Index = 0;
                    for (int col = -1; col <= 1; col++)
                    {
                        for (int row = -1; row <= 1; row++)
                        {
                            pixel = lbmp.GetPixel(x + row, y + col);
                            r += pixel.R * Gauss[Index];
                            g += pixel.G * Gauss[Index];
                            b += pixel.B * Gauss[Index];
                            Index++;
                        }
                    }
                    r /= 16;
                    g /= 16;
                    b /= 16;
                    //处理颜色值溢出
                    r = r > 255 ? 255 : r;
                    r = r < 0 ? 0 : r;
                    g = g > 255 ? 255 : g;
                    g = g < 0 ? 0 : g;
                    b = b > 255 ? 255 : b;
                    b = b < 0 ? 0 : b;
                    newlbmp.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));
                }
            }
            lbmp.UnlockBits();
            newlbmp.UnlockBits();
            this.bitmap = newbmp;
            return this;
        }

        /// <summary>
        /// 图像锐化处理
        /// </summary>
        /// <param name="bmp"></param>
        /// <returns></returns>
        public ImageDistinguish SharpenImage()
        {
            int height = this.bitmap.Height;
            int width = this.bitmap.Width;
            Bitmap newbmp = new Bitmap(width, height);

            LockBitmap lbmp = new LockBitmap(this.bitmap);
            LockBitmap newlbmp = new LockBitmap(newbmp);
            lbmp.LockBits();
            newlbmp.LockBits();

            Color pixel;
            //拉普拉斯模板
            int[] Laplacian = { -1, -1, -1, -1, 9, -1, -1, -1, -1 };
            for (int x = 1; x < width - 1; x++)
            {
                for (int y = 1; y < height - 1; y++)
                {
                    int r = 0, g = 0, b = 0;
                    int Index = 0;
                    for (int col = -1; col <= 1; col++)
                    {
                        for (int row = -1; row <= 1; row++)
                        {
                            pixel = lbmp.GetPixel(x + row, y + col); r += pixel.R * Laplacian[Index];
                            g += pixel.G * Laplacian[Index];
                            b += pixel.B * Laplacian[Index];
                            Index++;
                        }
                    }
                    //处理颜色值溢出
                    r = r > 255 ? 255 : r;
                    r = r < 0 ? 0 : r;
                    g = g > 255 ? 255 : g;
                    g = g < 0 ? 0 : g;
                    b = b > 255 ? 255 : b;
                    b = b < 0 ? 0 : b;
                    newlbmp.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));
                }
            }
            lbmp.UnlockBits();
            newlbmp.UnlockBits();
            return this;
        }
        /// <summary>
        /// 获取处理完成后的图片
        /// </summary>
        /// <returns></returns>
        public Bitmap Result()
        {
            return this.bitmap;
        }
        /// <summary>
        /// 识别二维码
        /// </summary>
        /// <returns></returns>
        public string Distinguish()
        {
            BarcodeReader reader = new BarcodeReader();
            //设置读取的格式(一般为UTF-8)  
            reader.Options.CharacterSet = "UTF-8";
            Result result = reader.Decode(this.bitmap);
            if (result != null)
            {
                return result.Text;
            }
            else
            {
                return "";
            }

        }
        /// <summary>
        /// 3×3中值滤波除杂,yuanbao,2007.10
        /// </summary>
        /// <param name="dgGrayValue"></param>
        public ImageDistinguish ClearNoise()
        {
            int x, y;
            byte[] p = new byte[9]; //最小处理窗口3*3
            byte s;
            int i, j;
            for (y = 1; y < this.bitmap.Height - 1; y++) //--第一行和最后一行无法取窗口
            {
                for (x = 1; x < this.bitmap.Width - 1; x++)
                {
                    //取9个点的值
                    p[0] = this.bitmap.GetPixel(x - 1, y - 1).R;
                    p[1] = this.bitmap.GetPixel(x, y - 1).R;
                    p[2] = this.bitmap.GetPixel(x + 1, y - 1).R;
                    p[3] = this.bitmap.GetPixel(x - 1, y).R;
                    p[4] = this.bitmap.GetPixel(x, y).R;
                    p[5] = this.bitmap.GetPixel(x + 1, y).R;
                    p[6] = this.bitmap.GetPixel(x - 1, y + 1).R;
                    p[7] = this.bitmap.GetPixel(x, y + 1).R;
                    p[8] = this.bitmap.GetPixel(x + 1, y + 1).R;
                    //计算中值
                    for (j = 0; j < 5; j++)
                    {
                        for (i = j + 1; i < 9; i++)
                        {
                            if (p[j] > p[i])
                            {
                                s = p[j];
                                p[j] = p[i];
                                p[i] = s;
                            }
                        }
                    }
                    this.bitmap.SetPixel(x, y, Color.FromArgb(p[4], p[4], p[4]));    //给有效值付中值
                }
            }
            return this;
        }
    }
public class LockBitmap
    {
        Bitmap source = null;
        IntPtr Iptr = IntPtr.Zero;
        BitmapData bitmapData = null;

        public byte[] Pixels { get; set; }
        public int Depth { get; private set; }
        public int Width { get; private set; }
        public int Height { get; private set; }

        public LockBitmap(Bitmap source)
        {
            this.source = source;
        }

        /// <summary>
        /// Lock bitmap data
        /// </summary>
        public void LockBits()
        {
            try
            {
                // Get width and height of bitmap
                Width = source.Width;
                Height = source.Height;

                // get total locked pixels count
                int PixelCount = Width * Height;

                // Create rectangle to lock
                Rectangle rect = new Rectangle(0, 0, Width, Height);

                // get source bitmap pixel format size
                Depth = System.Drawing.Bitmap.GetPixelFormatSize(source.PixelFormat);

                // Check if bpp (Bits Per Pixel) is 8, 24, or 32
                if (Depth != 8 && Depth != 24 && Depth != 32)
                {
                    throw new ArgumentException("Only 8, 24 and 32 bpp images are supported.");
                }

                // Lock bitmap and return bitmap data
                bitmapData = source.LockBits(rect, ImageLockMode.ReadWrite,
                                             source.PixelFormat);

                // create byte array to copy pixel values
                int step = Depth / 8;
                Pixels = new byte[PixelCount * step];
                Iptr = bitmapData.Scan0;

                // Copy data from pointer to array
                Marshal.Copy(Iptr, Pixels, 0, Pixels.Length);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Unlock bitmap data
        /// </summary>
        public void UnlockBits()
        {
            try
            {
                // Copy data from byte array to pointer
                Marshal.Copy(Pixels, 0, Iptr, Pixels.Length);

                // Unlock bitmap data
                source.UnlockBits(bitmapData);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Get the color of the specified pixel
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public Color GetPixel(int x, int y)
        {
            Color clr = Color.Empty;

            // Get color components count
            int cCount = Depth / 8;

            // Get start index of the specified pixel
            int i = ((y * Width) + x) * cCount;

            if (i > Pixels.Length - cCount)
                throw new IndexOutOfRangeException();

            if (Depth == 32) // For 32 bpp get Red, Green, Blue and Alpha
            {
                byte b = Pixels[i];
                byte g = Pixels[i + 1];
                byte r = Pixels[i + 2];
                byte a = Pixels[i + 3]; // a
                clr = Color.FromArgb(a, r, g, b);
            }
            if (Depth == 24) // For 24 bpp get Red, Green and Blue
            {
                byte b = Pixels[i];
                byte g = Pixels[i + 1];
                byte r = Pixels[i + 2];
                clr = Color.FromArgb(r, g, b);
            }
            if (Depth == 8)
            // For 8 bpp get color value (Red, Green and Blue values are the same)
            {
                byte c = Pixels[i];
                clr = Color.FromArgb(c, c, c);
            }
            return clr;
        }

        /// <summary>
        /// Set the color of the specified pixel
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="color"></param>
        public void SetPixel(int x, int y, Color color)
        {
            // Get color components count
            int cCount = Depth / 8;

            // Get start index of the specified pixel
            int i = ((y * Width) + x) * cCount;

            if (Depth == 32) // For 32 bpp set Red, Green, Blue and Alpha
            {
                Pixels[i] = color.B;
                Pixels[i + 1] = color.G;
                Pixels[i + 2] = color.R;
                Pixels[i + 3] = color.A;
            }
            if (Depth == 24) // For 24 bpp set Red, Green and Blue
            {
                Pixels[i] = color.B;
                Pixels[i + 1] = color.G;
                Pixels[i + 2] = color.R;
            }
            if (Depth == 8)
            // For 8 bpp set color value (Red, Green and Blue values are the same)
            {
                Pixels[i] = color.B;
            }
        }
    }