当前位置:   article > 正文

图片处理--图片识别以及抗干扰处理_图像识别 多拍图片综合处理

图像识别 多拍图片综合处理

 由于项目中需要用到图片识别来获取图片的金额,本文主要介绍如何用OpenCv库来处理图片,识别到所需的内容以及处理内部干扰。

需要引用的Dll如下所示:

使用场景介绍:1.解决背景颜色和文字颜色差异较大

                         2.目标数字背景有干扰线的情况

                         3.目标数字文本模糊的情况

                         4.目标文本数字之间靠拢过近情况

本文以数字背景存在干扰线情况做介绍,如下:

1. 图像灰度处理

图像灰度处理适用于背景颜色比较深的情况,能够有效的区分识别内容和背景

图像灰度前:

图像灰度后:

图像灰度化(内存法,速度最快)处理流程:

1. 通过截图宽高新建矩形获取要锁定的bitmap部分 

Rectangle rect = new Rectangle(0, 0, wide, height)
2.将Bitmap锁定到系统内存中,获得BitmapData
  1. BitmapData srcBmData = srcBitmap.LockBits(rect,ImageLockMode.ReadWrite,
  2.                                           PixelFormat.Format24bppRgb);

3.通过灰度化方法创建Bitmap

  1. Bitmap dstBitmap = CreateGrayscale(wide, height); //此方法用于创建灰度图
  2. BitmapData dstBmData = dstBitmap.LockBits(rect,ImageLockMode.ReadWrite,
  3. PixelFormat.Format8bppIndexed);
  4. IntPtr srcPtr = srcBmData.Scan0;
  5. IntPtr dstPtr = dstBmData.Scan0;
 

4.将Bitmap对象的信息存放到byte数组中

  1. int src_bytes = srcBmData.Stride * height;
  2. byte[] srcValues = new byte[src_bytes];
  3. int dst_bytes = dstBmData.Stride * height;
  4. byte[] dstValues = new byte[dst_bytes];
 

5.复制GRB信息到byte数组

  1. Marshal.Copy(srcPtr, srcValues, 0, src_bytes);
  2. Marshal.Copy(dstPtr, dstValues, 0, dst_bytes);
  3. for (int i = 0; i < height; i++)
  4. for (int j = 0; j < wide; j++)
  5. {
  6. //根据根据RGB彩色和亮度的计算公式:Y=0.299*R+0.114*G+0.587B,Y为亮度
  7. //注意位图结构中RGB按BGR的顺序存储
  8. int k = 3 * j;
  9. byte temp = (byte)(srcValues[i * srcBmData.Stride + k + 2] * .299
  10. + srcValues[i * srcBmData.Stride + k + 1] * .587
  11. + srcValues[i * srcBmData.Stride + k] * .114);
  12. dstValues[i * dstBmData.Stride + j] = temp;
  13. }
  14. Marshal.Copy(dstValues, 0, dstPtr, dst_bytes);

6.解锁位图

  1. srcBitmap.UnlockBits(srcBmData);
  2. dstBitmap.UnlockBits(dstBmData);

图像灰度:

  1. public static Bitmap CreateGrayscale(int width, int height) {
  2. Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
  3. // 将调色板设置为灰度
  4. if (srcImg.PixelFormat != PixelFormat.Format8bppIndexed)
  5. throw new ArgumentException();
  6. ColorPalette cp = srcImg.Palette;
  7.     for (int i = 0; i < 256; i++) {
  8.        cp.Entries[i] = Color.FromArgb(i, i, i);
  9. }
  10. srcImg.Palette = cp;
  11. return bmp;
  12. }
 

图像灰度反转:

  1. public static Bitmap GrayReverse(Bitmap bmp) {
  2.  for (int i = 0; i < bmp.Width; i++) {
  3.      for (int j = 0; j < bmp.Height; j++) {
  4. //获取该点的像素的RGB的颜色
  5. Color color = bmp.GetPixel(i, j);
  6. Color newColor = Color.FromArgb(255 - color.R, 255 - color.G, 255 - color.B);
  7. bmp.SetPixel(i, j, newColor);
  8. }
  9. }
  10. return bmp;
  11. }

2. 图像模糊处理

先灰度处理:

模糊处理前:

模糊处理后:

  1. private static Mat Blur(Mat src, int kernalSize) {
  2. var dst = new Mat();
  3. //图像平滑操作,使用OpenCvSharp.Blur均值滤波处理
  4. Cv2.Blur(src, dst, new OpenCvSharp.Size(kernalSize, kernalSize));
  5. return dst;
  6. }
 

参数解释:

kernalSize:表示滤波处理值,范围0~10

Src:表示InputArray类型的src,输入图像,即源图像,填Mat类的对象即可

Dst:表示OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型

new OpenCvSharp.Size(kernalSize, kernalSize):表示进行均值滤波的方框大小

3. 图像颜色加强处理

颜色加深处理前:

颜色加深处理后:

  1. private static Mat Threshold(Mat src, int thresh) {
  2. var dst = new Mat();
  3. Cv2.CvtColor(src, src, ColorConversionCodes.BGR2GRAY, 0);//转灰度图
  4. //对图像进行二值化处理
  5. _ = Cv2.Threshold(src, dst, thresh, 255, ThresholdTypes.Binary);
  6. return dst;
  7. }
 

Src-源图片

Dst-处理后的图

Thresh-阈值

255-填充色,取值范围0~255

ThresholdTypes.Binary-阈值类型

常用的有:

 • cv2.THRESH_BINARY(黑白二值)

 • cv2.THRESH_BINARY_INV(黑白二值反转)

 • cv2.THRESH_TRUNC (得到的图像为多像素值) 

 • cv2.THRESH_TOZERO 

 • cv2.THRESH_TOZERO_INV

4. 图片内容识别

调用OPencv库OcrPredict方法识别内容:

[DllImport("opencv_lite340.dll", EntryPoint = "ocrPredict", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]

public static extern int OcrPredict(byte[] src, int srclen, byte[] dst, int dstlen);

参数解释:

Src:图片的byte类型对象

SrcLength: 图片数据大小

Dst:处理数据的数组

Dstlength:处理数组的大小

部分代码如下:

  1. public bool Predict(byte[] data, out string str) {
  2. str = string.Empty;
  3. var array = new byte[64];
  4. var ocrNum = OcrPredict(data, data.Length, array, array.Length);
  5.     if (ocrNum != 0) {
  6. this.Warn($"OCR识别错误,OcrPredict={ocrNum}");
  7. return false;
  8. }
  9. // 找到字符串结尾的\0
  10. var indexLast = Array.IndexOf<byte>(array, 0);
  11. str = Encoding.UTF8.GetString(array, 0, indexLast);
  12. return true;
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/324879
推荐阅读
相关标签
  

闽ICP备14008679号