好吧,我无法在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");
我没有达到预期的准确性。请检查图像的转换方式。
我在上面贴了几张图片供您参考。对于第一张图片,我正在获取垃圾数据。对于最后两个图像,我正在获取部分数据。 将图像转换为灰度并使用阈值可以提供更好的输出。
我想了解,如果阈值是关键部分,那么我将如何获得每个新图像的动态阈值?它将作为服务工作,因此用户只需传递图像即可获得结果。我的应用应该足够智能以处理和理解图像。
我必须更准确地调整对比度,阈值吗?如果是,我将如何做?或图像本身有问题,我是说噪声导致问题。
请让我知道我在算法上做错了什么,或任何可以帮助我理解问题的内容。有谁知道,请告诉我什么是OCR图像预处理的理想步骤?
我正在使用csharp,emucv和tesseract。 任何建议将不胜感激。