C#基于OpenCVsharp提取文字区域

最近工作中需要用到图像文字识别,但由于图像比较大需要识别的文字比较多,所以全图识别的话效果不好,所以需要对文字区域进行检测提取,再进行识别。

功能需要用.net实现,自己对图像识别方面并不熟悉,于是上网找资料发现Python方面的资料比较多,但C#方面的资料真是少之又少。找到的参考文章https://blog.csdn.net/huobanjishijian/article/details/63685503 写的比较详细。

首先想到的是用C#调用Python程序,但是实践以后发现速度比较慢,由于处理的图片比较多,所以放弃了这种方法。

由于C#也有相应的opencv库,所以最终准备根据Python代码重写C#代码。

先在工具 - nuget中搜索安装OpenCVSharp3,注意OpenCVSharp4也已经有了,但是代码与OpenCVSharp3有较大区别,并且OpenCVSharp3与Python代码的方法比较接近,所以选择OpenCVSharp3。

C#基于OpenCVsharp提取文字区域_第1张图片

原理请大家主要看原文章,写的很详细了,这里贴出一部分源码,如需完整代码,请查看我的资源或者github

https://github.com/jsnjfz/OpenCVSharpDemo.git

            //读取灰度图
            using (Mat src = new Mat(imgPath, ImreadModes.Grayscale))
            {
                //1.Sobel算子,x方向求梯度
                Mat sobel = new Mat();
                Cv2.Sobel(src, sobel, MatType.CV_8U, 1, 0, 3);

                //2.二值化
                Mat binary = new Mat();
                Cv2.Threshold(sobel, binary, 0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary);

                //3. 膨胀和腐蚀操作的核函数
                Mat element1 = new Mat();
                Mat element2 = new Mat();
                OpenCvSharp.Size size1 = new OpenCvSharp.Size(30, 9);
                OpenCvSharp.Size size2 = new OpenCvSharp.Size(24, 6);

                element1 = Cv2.GetStructuringElement(MorphShapes.Rect, size1);
                element2 = Cv2.GetStructuringElement(MorphShapes.Rect, size2);

                //4. 膨胀一次,让轮廓突出
                Mat dilation = new Mat();
                Cv2.Dilate(binary, dilation, element2);

                //5. 腐蚀一次,去掉细节,如表格线等。注意这里去掉的是竖直的线
                Mat erosion = new Mat();
                Cv2.Erode(dilation, erosion, element1);

                //6. 再次膨胀,让轮廓明显一些
                Cv2.Dilate(erosion, dilation2, element2, null, 3);
            }

识别效果如图,和原文章一致,经测试批量识别效果也可以接受

C#基于OpenCVsharp提取文字区域_第2张图片

转载请注明来源。

 

你可能感兴趣的:(C#基于OpenCVsharp提取文字区域)