『QQ:1353814576』

OpenCVsharp 实现文本区域检测提取图片中文本区域坐标


OpenCVsharp实现提取文本区域检测 来提取图片中的文本区域坐标


对于整个系统来说最大的利益点就是胶片打印,基本软件系统就是附赠品 耗材费用才是盈利点,但胶片打印识别这块也是最麻烦的,不同设备, 不同医院 ,不同医生,甚至于不同患者都有可能导致胶片上的字体位置、大小、字体的变化。最终就可能导致识别失败

为了解决这个问题,围绕着谷歌的开源ocr组件tesseract-ocr做了一系列辅助ocr识别的工具 ,文本区域检测工具就是其中一项 节省了胶片整张识别的效率问题 核心代码也是抄网络大神的

文本区域检测的逻辑就是 通过对图片二值化处理再通过反复腐蚀膨胀得到一个接近矩形的方块 然后将这些矩形框选出来就得到了文本所在区域 再根据一系列过滤规则提取到我们所需要的区域 进行识别减少不必要的图像识别 以提升系统整体效率

核心代码步骤如下:

  1. 文字区域处理
      public void FindText(string imgPath)
        {
            Mat dilation2 = new Mat();
            //读取灰度图
            using (Mat src = new Mat(imgPath, ImreadModes.Grayscale))
            {
                Cv2.ImShow("原始图像", src);

                //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(20, 20);
                OpenCvSharp.Size size2 = new OpenCvSharp.Size(16, 10);

                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);

                Cv2.ImShow("文本处理效果", dilation2);
            }
            this.FindTextRegion(dilation2, imgPath);

        }
  1. 将处理过的图像里的文字区域框选出来