【OpenCvSharp】如何轻松提取图片中的文字区域?

目录

效果

项目

代码


 

效果

测试图片来自网络,如有侵权,联系删除。

图片

项目

图片

代码

using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace OpenCvSharp_提取文字区域
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Mat mat;

        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = new Bitmap("test.jpg");
            mat = new Mat("test.jpg");
            Mat temp = Preprocess("test.jpg");
            pictureBox2.Image = FindTextRegion(temp);
        }

        public Bitmap FindTextRegion(Mat dilation)
        {
            // 1. 查找轮廓
            OpenCvSharp.Point[][] contours;
            HierarchyIndex[] hierarchly;
            Rect biggestContourRect = new Rect();

            Cv2.FindContours(dilation, out contours, out hierarchly, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);

            // 2. 筛选那些面积小的
            foreach (OpenCvSharp.Point[] contour in contours)
            {
                double area = Cv2.ContourArea(contour);

                //面积小的都筛选掉
                if (area < 1000)
                {
                    continue;
                }

                //轮廓近似,作用很小
                double epsilon = 0.001 * Cv2.ArcLength(contour, true);

                //找到最小的矩形
                biggestContourRect = Cv2.BoundingRect(contour);

                if (biggestContourRect.Height > (biggestContourRect.Width * 1.2))
                {
                    continue;
                }
                //画线
                mat.Rectangle(biggestContourRect, new Scalar(0, 255, 0), 2);
            }
            return mat.ToBitmap();
        }

        public Mat Preprocess(string imgPath)
        {
            Mat dilation2 = new Mat();
            //读取灰度图
            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);
            }
            return dilation2;
        }
    }
}

引入地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF是Windows Presentation Foundation的缩写,是一种用于创建客户端应用程序的开发框架。而OpenCvSharp4是一个基于OpenCV的C#封装库,用于实现计算机视觉相关的功能。 在WPF使用OpenCvSharp4实现文字提取的过程如下: 首先,需要在项目引入OpenCvSharp4的库文件,并在代码添加对该库的引用。 然后,可以使用OpenCvSharp4的图像处理函数对图像进行预处理,例如灰度化、二值化等。这些处理可以通过调用相应的函数来实现,如cv.CvtColor()、cv.Threshold()等函数。 接下来,可以使用OpenCvSharp4文字提取功能对图像进行处理。可以选择使用OCR(Optical Character Recognition,光学字符识别)算法,通过训练模型来识别文字OpenCvSharp4库提供了OCR相关的函数,例如cv.TextOcr()等。 在调用文字提取函数时,需要将预处理后的图像作为函数的输入,并指定相关参数。然后,函数会返回识别出的文字或文本区域的信息。 最后,可以将识别出的文字信息在WPF应用程序的界面上进行展示或保存到文件,以便用户查看。 需要注意的是,文字提取是一项复杂的任务,其结果可能受到多种因素的影响,如图像质量、文字大小、字体等。因此,在实际使用,可能需要对文字提取功能进行调试和优化,以获得更好的识别效果。 综上所述,通过使用WPF和OpenCvSharp4,我们可以实现文字提取的功能,将图像文字信息提取出来,并展示给用户或进行后续处理。这对于一些需要文字识别的应用场景,如自动化办公、图像搜索等,具有重要的实际意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值