使用OpenCVSharp提取底色文字相近的文字轮廓
最近一直在忙关于OCR影像文字识别的事情,一直被背景色与内容文字颜色相近的图像搞得头大,各种图像处理但是识别效果不够理想而且操作十分繁琐。
偶然发现了一篇关于OpenCVSharp文章受此启发,结合计算机视觉库对图像进行处理,设置适当的阙值提取到文字的轮廓,然后对轮廓进行图像识别,这种方式的识别效果较之前要好很多,且操作也要简单很多,美中不足的就是对于面积较大的图像生成较慢;
混杂色图像文字识别思路 通过OpenCVSharp将文字轮廓提取出来,再通过ocr来识别取得的轮廓 从而避免了混杂色来提升识别率
方法如下 Nuget引用OpenCVSharp视觉库 即可使用
////// 图像二值化 /// /// /// 阙值 0~255 越大约白 /// 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 来做微调
一般来说 混杂色越相近,设置阙值就需越大