[openCV]文本识别中的分割算法

OCR(Optical Character Recognition)光学字符识别,用来处理图像上的文本识别。其中有一个步骤叫做文本预处理和分割,在这个步骤中需要学会处理图像噪声和旋转,并且要确定候选文本的区域。

1、图像阀值化,消除所有颜色的信息,有用的信息填入白色,背景填入黑色

Mat Ocr::binarize(Mat input){
    Mat binaryImage;
    cvtColor(input, input, COLOR_BGR2GRAY);
    //THRESH_OTSU 大津法
    threshold(input, binaryImage, 0, 255, THRESH_OTSU);
    //计算黑白像素的数据
    int white=countNonZero(binaryImage);
    int black=binaryImage.size().area()-white;
    //如果白色比较多,反转它
    return white<black?binaryImage:~binaryImage;
}

2、文本切割,找到文本所在的位置并提取他。创建连通区域(使用连通分量分析,搜索图像组的连接图像)

使用膨胀使图像元素加粗

Mat Ocr::showDilated(Mat input){
    Mat dilated;
    Mat kernel=getStructuringElement(MORPH_CROSS, Size(3,3));
    dilate(input, dilated, kernel,Point(-1,-1),9);
    imshow("dilated", dilated);
    return dilated;
}

    

3、识别段落块

vector<RotatedRect> Ocr::findTextAreas(Mat input){
    vector<RotatedRect> areas;
    vector<vector<Point>> contours;
    findContours(input, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
    for(auto contour:contours)
    {
        
        //找到旋转矩阵,确定每个轮廓的最小边界
        auto box=minAreaRect(contour);
        //丢弃非常小的矩阵
        if(box.size.width<20||box.size.height<20)
        {
            continue;
        }
        double pro=box.angle<-45.0?box.size.height/box.size.width:box.size.width/box.size.height;
        if(pro<2)
        {
            continue;
        }
        areas.push_back(box);
    }
    printf("areas=====%d\n",areas.size());
    return areas;
}

4、文本提取和倾斜调整

Mat Ocr::deskewAndCrop(Mat input, const RotatedRect &box){
    Mat cropped;
    double angle=box.angle;
    Size2f size=box.size;
    if(angle<-45.0)
    {
        angle+=90.0;
        //交换宽高
        swap(size.width, size.height);
    }
    //根据角度旋转文本,getRotationMatrix2D二维防射变换矩阵,1。0保持原始比例
    Mat transform=getRotationMatrix2D(box.center, angle, 1.0);
    Mat rotated;
    warpAffine(input, rotated, transform, input.size(),INTER_CUBIC);
    //裁剪结果
    getRectSubPix(rotated, size, box.center, cropped);
    copyMakeBorder(cropped, cropped, 10, 10, 10, 10, BORDER_REFLECT,Scalar(0));
    return cropped;
}
 Mat ticket= ocr->binarize(imread("/Users/linfangfang/Desktop/pic.jpg"));
    Mat dilated= ocr->showDilated(ticket);
  // imshow("ticket test", dilated);
    auto regions=ocr->findTextAreas(dilated);
    for(auto region:regions){
        auto cropped=ocr->deskewAndCrop(ticket, region);
        imshow("cropped test", cropped);
        waitKey(0);
        destroyAllWindows();
    }
    //waitKey(0);
    
   //destroyAllWindows();
    delete ocr;

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV是一个开源的计算机视觉库,而Python是一种常用的编程语言。基于神经网络的文本识别是指使用神经网络模型来识别和理解图像的文字内容。 在使用OpenCV进行基于神经网络的文本识别时,首先需要准备一个训练好的神经网络模型。可以使用一些已有的模型,如CRNN(卷积递归神经网络)等,也可以自己设计和训练一个适合特定任务的模型。 接下来,需要对待识别的图像进行预处理。这包括图像的标准化、降噪、二值化等操作,以提高模型的准确性。可以使用OpenCV提供的函数和方法来实现这些预处理步骤。 然后,利用训练好的神经网络模型对预处理后的图像进行识别。这涉及图像的分割、特征提取和字符识别等步骤。可以使用OpenCV的图像处理和机器学习的相关函数和方法来实现这些步骤。 最后,根据识别结果进行后续的处理和应用。可以将识别出的文字内容进行存储、显示或其他后续处理,以满足具体的需求。 需要注意的是,基于神经网络的文本识别是一项复杂的任务,它涉及多个步骤和技术,需要有一定的计算机视觉和机器学习基础才能理解和实现。同时,模型的训练和调优也需要大量的数据和计算资源。因此,对于初学者来说,可以先从简单的任务和案例入手,逐步学习和掌握相关的知识和技能。 ### 回答2: OpenCV是一个开源的计算机视觉库,提供了许多图像处理和计算机视觉的功能。而Python是一种流行的编程语言,因其简洁易学以及强大的科学计算和机器学习库支持而被广泛应用。 基于神经网络的文本识别是指利用神经网络模型来实现对文本的自动识别和理解。在使用OpenCV和Python进行基于神经网络的文本识别时,可以采用如下步骤: 1. 数据收集和预处理:收集一组包含文本的图像样本,并对这些图像进行预处理,如灰度化、二值化、去噪等操作,以便后续处理。 2. 构建神经网络模型:使用Python的神经网络库(如TensorFlow、PyTorch等)构建一个适合文本识别任务的神经网络模型,如卷积神经网络(CNN)或循环神经网络(RNN)等。 3. 训练模型:使用预处理后的图像数据作为训练数据,将其输入到神经网络模型进行训练。通过反向传播算法不断调整神经网络的参数,使其能够逐渐提高对文本识别准确度。 4. 模型评估和调优:使用评估集对训练好的模型进行测试,并根据评估结果对模型进行调整和改进,以提高文本识别的准确度和鲁棒性。 5. 文本识别:使用训练好的模型对新的图像进行文本识别。将预处理后的图像输入到模型,利用已学习到的知识对文字进行预测和识别,得到文本内容。 通过OpenCV和Python的组合,我们可以方便地对图像进行处理和分析,同时利用Python的强大库支持,如神经网络库和数据处理库,能够更加高效地构建、训练和优化文本识别模型。这种基于神经网络的文本识别方法在实际应用有着广泛的应用前景,如自动化文字识别系统、图像翻译、自然语言处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值