如何使用emgucv提高Tesseract中OCR文本检测的准确性?

时间:2020-07-27 19:16:24

标签: c# opencv ocr tesseract emgucv

好吧,我无法在tesseract中获得很好的文本检测准确性。请检查下面的代码和图像。

       Mat imgInput = CvInvoke.Imread(@"D:\workspace\raw2\IMG_20200625_194541.jpg", ImreadModes.AnyColor);
      
      int kernel_size = 11;

           //Dilation

            Mat imgDilatedEdges = new Mat();
            CvInvoke.Dilate(
                                      imgInput,
                                      imgDilatedEdges,
                                      CvInvoke.GetStructuringElement(
                                       ElementShape.Rectangle,
                                           new Size(kernel_size, kernel_size),
                                          new Point(1, 1)),
                                          new Point(1, 1),
                                            1,
                                          BorderType.Default,
                                            new MCvScalar(0));
            //Blur
            Mat imgBlur = new Mat();
            CvInvoke.MedianBlur(imgDilatedEdges, imgBlur, kernel_size);

            //Abs diff
            Mat imgAbsDiff = new Mat();
            CvInvoke.AbsDiff(imgInput, imgBlur, imgAbsDiff);


            Mat imgNorm = imgAbsDiff;


            //Normalize
            CvInvoke.Normalize(imgAbsDiff, imgNorm, 0, 255, NormType.MinMax, DepthType.Default);

         
            
            Mat imgThreshhold = new Mat();
            //getting threshhold value
            double thresholdval = CvInvoke.Threshold(imgAbsDiff, imgThreshhold, 230, 0, ThresholdType.Trunc);

           

            //Normalize
            CvInvoke.Normalize(imgThreshhold, imgThreshhold, 0, 255, NormType.MinMax, DepthType.Default);
            imgThreshhold.Save(@"D:\workspace\ocr_images\IMG_20200625_194541.jpg");
      

            //contrast correction
            Mat lab = new Mat();
            CvInvoke.CvtColor(imgThreshhold, lab, ColorConversion.Bgr2Lab);
            VectorOfMat colorChannelB = new VectorOfMat();
            CvInvoke.Split(lab, colorChannelB);

            CvInvoke.CLAHE(colorChannelB[0], 3.0, new Size(12, 12), colorChannelB[0]);


            Mat clahe = new Mat();

            //merge
            CvInvoke.Merge(colorChannelB, clahe);
         

            Image<Bgr, byte> output = new Image<Bgr, byte>(@"D:\workspace\ocr_images\IMG_20200625_194541.jpg");
            Bitmap bmp = output.ToBitmap();

            //setting image to 300 dpi since tesseract likes that
            bmp.SetResolution(300, 300);
            bmp.Save(@"D:\workspace\ocr_images\IMG_20200625_194541.jpg");

我没有达到预期的准确性。请检查图像的转换方式。

源图像 enter image description here

转换后的图像enter image description here

enter image description here

enter image description here

我在上面贴了几张图片供您参考。对于第一张图片,我正在获取垃圾数据。对于最后两个图像,我正在获取部分数据。 将图像转换为灰度并使用阈值可以提供更好的输出。

我想了解,如果阈值是关键部分,那么我将如何获得每个新图像的动态阈值?它将作为服务工作,因此用户只需传递图像即可获得结果。我的应用应该足够智能以处理和理解图像。

我必须更准确地调整对比度,阈值吗?如果是,我将如何做?或图像本身有问题,我是说噪声导致问题。

请让我知道我在算法上做错了什么,或任何可以帮助我理解问题的内容。有谁知道,请告诉我什么是OCR图像预处理的理想步骤?

我正在使用csharp,emucv和tesseract。 任何建议将不胜感激。

0 个答案:

没有答案