『QQ:1353814576』

Tesseract.OCR配合OpenCVSharp 实现相近色背景图像文字的提取


使用OpenCVSharp提取底色文字相近的文字轮廓

最近一直在忙关于OCR影像文字识别的事情,一直被背景色与内容文字颜色相近的图像搞得头大,各种图像处理但是识别效果不够理想而且操作十分繁琐。

偶然发现了一篇关于OpenCVSharp文章受此启发,结合计算机视觉库对图像进行处理,设置适当的阙值提取到文字的轮廓,然后对轮廓进行图像识别,这种方式的识别效果较之前要好很多,且操作也要简单很多,美中不足的就是对于面积较大的图像生成较慢;

混杂色图像文字识别思路 通过OpenCVSharp将文字轮廓提取出来,再通过ocr来识别取得的轮廓 从而避免了混杂色来提升识别率

方法如下 Nuget引用OpenCVSharp视觉库 即可使用

/// <summary>
/// 图像二值化
/// </summary>
/// <param name="ImageOriginal"></param>
/// <param name="ThresholdNumber">阙值 0~255 越大约白</param>
/// <returns></returns>
public static System.Drawing.Bitmap Threshold(this System.Drawing.Bitmap ImageOriginal, int ThresholdNumber=200)
{
            if (ThresholdNumber <= 0)
            {
                return ImageOriginal;
            }
            System.Drawing.Bitmap ImageBaseOriginal = ImageOriginal;
            Mat mat1 = OpenCvSharp.Extensions.BitmapConverter.ToMat(ImageBaseOriginal);
            Mat mat2 = new Mat();
            Mat mat8 = mat1.EmptyClone();
            Cv2.CvtColor(mat1, mat2, ColorConversionCodes.BGR2GRAY, 0);//转灰度图
            Cv2.Threshold(mat2, mat2, ThresholdNumber, 255, ThresholdTypes.Binary);//二值化
            //读取轮廓
            OpenCvSharp.Point[][] contours;
            HierarchyIndex[] hierarchy;
            Cv2.FindContours(mat2, out contours, out hierarchy, RetrievalModes.CComp, ContourApproximationModes.ApproxSimple, null);
            //得到轮廓绘制
            for (int i = 0; i < hierarchy.Length; i++)
            {
                ///大图像慢就慢在这里
                Cv2.DrawContours(mat8, contours, i, Scalar.White,1, LineTypes.Link8, hierarchy, 
				0, new OpenCvSharp.Point(0, 0));
            }
            ImageBaseOriginal = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat8);
            mat1.Dispose();
            mat2.Dispose();
            mat8.Dispose();
            return ImageBaseOriginal;
 }

实现效果如下图

使用OpenCVSharp提取底色文字相近的文字轮廓 对这些识别精度不足的可以是尝试修改 ThresholdNumber 来做微调 一般来说 混杂色越相近,设置阙值就需越大