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;
}
实现效果如下图
对这些识别精度不足的可以是尝试修改 ThresholdNumber 来做微调 一般来说 混杂色越相近,设置阙值就需越大