主要内容

本页采用了机器翻译。点击此处可查看英文原文。

ocr

使用光学字符识别技术识别文本

说明

txt = ocr(I) 返回一个 ocrText 对象,其中包含来自输入图像 I 的光学字符识别 (OCR) 信息。该对象包含已识别的字符、单词、文本行、已识别单词的位置,以及一个表示每个识别结果置信度的度量。

示例

txt = ocr(I,roi) 能够识别一个或多个矩形区域内 I 中的文本。

示例

txt = ocr(ds) 返回一个由 ocrText 对象组成的元胞数组,其中每个对象都包含针对数据存储 ds 中指定的感兴趣区域 (ROI) 的、对应图像的识别结果。使用此语法对一组图像执行 OCR 操作。默认情况下,ocr 函数假设每个 ROI 仅包含一行文本。若要处理可能包含多行文本的感兴趣区域 (ROI),请将 LayoutAnalysis 名称-值参量设置为 "block"

txt = ocr(___,Name=Value) 支持上述语法中的任何参量组合,且可使用一个或多个名称-值参量指定选项。例如,LayoutAnalysis="page" 将图像视为包含文本模块的一页。

示例

示例

全部折叠

将一张带有文字的图像加载到工作区中。

businessCard = imread("businessCard.png");
ocrResults = ocr(businessCard)
ocrResults = 
  ocrText with properties:

                      Text: '4 MathWorks:↵↵ ↵↵The MathWorks, Inc.↵↵-3 Apple Hill Drive↵Natick, MA 01760-2098↵USA↵↵www.mathworks.com↵↵ ↵↵'
    CharacterBoundingBoxes: [107×4 double]
      CharacterConfidences: [107×1 single]
                     Words: {16×1 cell}
         WordBoundingBoxes: [16×4 double]
           WordConfidences: [16×1 single]
                 TextLines: {8×1 cell}
     TextLineBoundingBoxes: [8×4 double]
       TextLineConfidences: [8×1 single]

     recognizedText = ocrResults.Text;    
     figure
     imshow(businessCard)
     text(600,150,recognizedText,BackgroundColor=[1 1 1]);

Figure contains an axes object. The hidden axes object contains 2 objects of type image, text.

将图像读入工作区。

I = imread("handicapSign.jpg");

在输入图像中定义一个或多个用于识别文本的矩形感兴趣区域。

roi = [370 246 363 423];

此外,您还可以使用 drawrectangle 通过鼠标选择一个区域。

例如,

figure;imshow(I)

roi = round(getPosition(drawrectangle))

识别感兴趣区域 (ROI) 内的文本。

ocrResults = ocr(I,roi);

将识别出的文本插入到原始图像中。显示带有已识别文本的图像。

Iocr = insertText(I,roi(1:2),ocrResults.Text,AnchorPoint="RightTop",FontSize=16);
figure
imshow(Iocr)

Figure contains an axes object. The hidden axes object contains an object of type image.

将包含七段显示器的图像读入工作区。

I = imread("sevSegDisp.jpg");

指定包含七段显示器的 ROI。

roi = [506 725 1418 626];

要识别七段显示器上的数字,请将 Model 参量指定为 "seven-segment"

ocrResults = ocr(I,roi,Model="seven-segment");

显示识别出的数字和检测置信度。

fprintf("Recognized seven-segment digits: ""%s""\nDetection confidence: %0.4f",cell2mat(ocrResults.Words),ocrResults.WordConfidences)
Recognized seven-segment digits: "5405.9"
Detection confidence: 0.7948

将识别出的数字填入图像中。

Iocr = insertObjectAnnotation(I,"rectangle", ...
            ocrResults.WordBoundingBoxes,ocrResults.Words,LineWidth=5,FontSize=72);
figure
imshow(Iocr)

Figure contains an axes object. The hidden axes object contains an object of type image.

将包含文本的图像读取到工作区中。

businessCard = imread("businessCard.png");
ocrResults = ocr(businessCard)
ocrResults = 
  ocrText with properties:

                      Text: '4 MathWorks:↵↵ ↵↵The MathWorks, Inc.↵↵-3 Apple Hill Drive↵Natick, MA 01760-2098↵USA↵↵www.mathworks.com↵↵ ↵↵'
    CharacterBoundingBoxes: [107×4 double]
      CharacterConfidences: [107×1 single]
                     Words: {16×1 cell}
         WordBoundingBoxes: [16×4 double]
           WordConfidences: [16×1 single]
                 TextLines: {8×1 cell}
     TextLineBoundingBoxes: [8×4 double]
       TextLineConfidences: [8×1 single]

Iocr = insertObjectAnnotation(businessCard,"rectangle", ...
                           ocrResults.WordBoundingBoxes, ...
                           ocrResults.WordConfidences);
figure
imshow(Iocr)

Figure contains an axes object. The hidden axes object contains an object of type image.

将一张包含文本的图像加载到工作区中。

businessCard = imread("businessCard.png");
ocrResults = ocr(businessCard);
bboxes = locateText(ocrResults,"Math",IgnoreCase=true);
Iocr = insertShape(businessCard,"FilledRectangle",bboxes);
figure
imshow(Iocr)

Figure contains an axes object. The hidden axes object contains an object of type image.

本示例演示了如何在数据集上评估一个能够识别七段式数字的 OCR 模型的准确率。评估数据集包含带有七段式数字的电表显示屏图像。

下载并解压数据集。

datasetURL = "https://ssd.mathworks.com/supportfiles/vision/data/7SegmentImages.zip";
datasetZip = "7SegmentImages.zip";
if ~exist(datasetZip,"file")
    disp("Downloading evaluation dataset (" + datasetZip + " - 96 MB) ...");
    websave(datasetZip,datasetURL);
end

datasetFiles = unzip(datasetZip);

加载评估真实值。

ld = load("7SegmentGtruth.mat");
gTruth = ld.gTruth;

使用 ocrTrainingData 函数,基于 groundTruth 对象中的图像、边界框和文本标签,并采用标注过程中使用的标签名和属性名,创建包含这些数据的数据存储。

labelName = "Text";
attributeName = "Digits";
[imds,boxds,txtds] = ocrTrainingData(gTruth,labelName,attributeName);

合并数据存储。

cds = combine(imds,boxds,txtds);

对评估数据集运行 OCR。

results = ocr(cds, Model="seven-segment");

根据真实值对 OCR 结果进行评估。

metrics = evaluateOCR(results,cds);
Evaluating ocr results
----------------------
* Selected metrics: character error rate, word error rate.
* Processed 119 images.
* Finalizing... Done.
* Data set metrics:

    CharacterErrorRate    WordErrorRate
    __________________    _____________

         0.082195            0.19958   

显示 OCR 模型的精度。

modelAccuracy = 100*(1-metrics.DataSetMetrics.CharacterErrorRate);
disp("Accuracy of the OCR model= " + modelAccuracy + "%")
Accuracy of the OCR model= 91.7805%

输入参数

全部折叠

输入图像,指定为 M×N×3 的真彩色图像、M×N 的灰度图像或 M×N 的二值图像。输入图像必须由真实的、非稀疏值组成。该函数在进行字符识别之前,会使用大津阈值法将真彩色或灰度输入图像转换为二值图像。为了获得最佳的 OCR 识别效果,请选择一个图像,其中小写字母 x 或类似字符的高度大于 20 像素。为了获得更好的结果,请消除文本相对于水平轴或垂直轴在任一方向上超过 10 度的旋转。输入图像的宽度或高度必须小于 2^16 (32,768) 像素。

数据类型: single | double | int16 | uint8 | uint16 | logical

矩形感兴趣区域,指定为一个 M×4 的矩阵。每一行以 [x y width height] 的形式指定输入图像中的一个感兴趣区域,其中 [x y] 指定左上角的位置,[width height] 指定该矩形感兴趣区域的大小(以像素为单位)。每个矩形必须完全位于输入图像 I 之内。在识别过程开始之前,该函数会使用大津阈值法,将真彩色和灰度输入的感兴趣区域转换为二值区域。

为了在使用 ocr 识别七段式数字时获得最佳效果,请指定一个 roi,使其仅包围图像中包含七段式数字的部分。

评估数据,指定为一个数据存储,当作为输入传递给 read 函数时,该数据存储将返回一个元胞数组或一个表格。数据存储在调用 read 函数时,必须返回一个元胞数组或表格,其中至少包含以下两列:

  • 第 1 列 - 包含逻辑值、灰度图像或 RGB 图像的元胞向量。

  • 第 2 列 - 一个元胞向量,其中包含 numROIs×4 个边界框矩阵,这些矩阵的形式为 [x y width height],用于指定每个图像中的文本位置。

使用数据存储输入时,LayoutAnalysis 名称-值参量的值必须为 "auto""none

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

示例: txt = ocr(I,LayoutAnalysis="page") 将图像中的文本视为包含多个文本模块的一页。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

要对文本分段执行的排版分析类型,指定为以下选项之一:

LayoutAnalysis 值文本处理
"auto"

如果 Model 参量的值为 "seven-segment",则将图像中的文本视为 LayoutAnalysis 的值为 "block"。如果指定了 ds 参量,则会将图像中的文本视为 LayoutAnalysis 的值为 "none"。否则,该函数会将图像中的文本视为 "page"

"page"将图像中的文本视为包含文本模块的一页。
"block"将图像中的文本视为一个整体文本模块。
"line"将图像中的文本视为一行文本。
"word"将图像中的文本视为一个单词。
"character"将图像中的文本视为单个字符。
"none"请勿进行布局分析。最适合用于仅含一行文字的图像。

您可以使用 LayoutAnalysis 参量来确定输入图像中文字的布局。例如,您可以将 LayoutAnalysis 设置为 "page",以便识别来自扫描文档中具有特定格式(例如双栏)的文本。此设置可保留返回文本中的阅读顺序。

如果输入图像中包含几个文本区域,或者文本位于杂乱的场景中,ocr 函数可能会返回质量较差的结果。如果光学字符识别 (OCR) 结果不理想,请尝试使用另一种布局,使其更符合图像中的文本。如果文本位于杂乱的场景中,除了尝试不同的布局外,还可以尝试在图像中围绕文本指定一个感兴趣区域 (ROI)。

用于识别的模型,指定为以下选项之一;

  • "english""japanese""seven-segment" - 这些分别指定用于检测英语文本、日语文本或七段式数字的内置建模模型。

  • 字符向量或字符串标量 - 使用此选项指定自定义模型,或指定 OCR 语言数据文件支持包中包含的附加语言模型之一。

  • 元胞数组或字符串数组 - 使用此选项可指定多个模型,以便同时进行检测。

若要提高使用内置模型(包括任何已安装的附加语言模型)时的性能,可在语言模型字符串后添加 -fast。例如,"english-fast""japanese-fast""seven-segment-fast"

您还可以安装其他模型或添加自定义模型。有关详细信息,请参阅安装 OCR 语言数据文件

指定多种语言后,系统可同时识别所有选定的语言。但是,选择多种语言可能会降低 ocr 函数的准确性,并增加其处理时间。若要指定 安装 OCR 语言数据文件 包中包含的任何其他语言,请按照与内置语言相同的方式进行指定。您无需指定路径。例如,要指定芬兰语文本识别:

txt = ocr(img,Model="finnish");

 支持包中支持的 OCR 语言列表

若要为 trainOCR 输出使用您自己的自定义模型,可以使用以下语法:

ocrResults = ocr(I,Model=ocrModel);
其中 ocrModel 包含该模型的完整路径。

对于由 MATLAB® Coder™ 生成的部署目标:生成的 OCR 可执行文件和语言模型文件必须位于同一目录下。

  • 英语:C:/path/to/eng.traineddata

  • 日语:C:/path/to/jpn.traineddata

  • 对于七段式显示:C:/path/to/seven_segment.traineddata

  • 对于自定义数据文件:C:/path/to/customlang.traineddata

  • C:/path/ocr_app.exe

您可以从该文件夹中复制英语、日语和七段式训练数据文件:

fullfile(matlabroot,"toolbox","vision","visionutilities","tessdata_best");

字符子集,指定为字符向量或字符串标量。默认情况下,CharacterSet 被设置为空字符向量 "",该向量指定了用于搜索由 Model 名称-值参量指定的语言模型中所有字符的函数。您可以将此值设置为一个较小的已知字符集,以限制分类过程。

ocr 函数会从 CharacterSet 中为检测到的文本选择最匹配的结果。利用关于输入图像中字符的可推断信息,有助于提高文本识别的准确率。例如,如果您将 CharacterSet 设置为全数字字符串 "0123456789",函数会尝试将每个字符仅与数字进行匹配。在这种情况下,ocr 函数可能会错误地将非数字字符识别为数字。

如果您将 Model 指定为 seven-segment,那么 ocr 函数将使用 CharacterSet 的值 "0123456789.:-"

输出参量

全部折叠

已识别的文本和度量值,以 ocrText 对象、ocrText 对象数组或 ocrText 对象的元胞数组形式返回。每个对象都包含输入图像中被识别的文本及其位置,以及反映识别结果置信度的度量指标。置信度值位于 [0,1] 范围内,表示百分比概率。txt 的输出形式取决于您向 ocr 函数传入的是整个图像、包含一个 ROI 的单个图像、包含多个 ROI 的单个图像,还是一个数据集。

提示

光学字符识别 (OCR) 语言数据文件为 Tesseract OCR 引擎提供了预训练的语言模型,从而能够准确、高效地提取多种语言的文本。这些文件旨在与 Computer Vision Toolbox™ 集成,使您能够利用其跨多种语言的高级 OCR 功能。有关安装这些语言数据文件、启用第三方语言支持,以及使用预训练模型配合 ocr 函数进行多语言文本识别的分步指南,请参阅安装 OCR 语言数据文件。有关 OCR 工作流和基本用法的概述,请参阅Getting Started with OCR

如果您的 OCR 识别结果与预期不符,请尝试以下一种或多种选项:

  • 将图像尺寸放大 2 至 4 倍。

  • 如果图像中的字符间距过近或边缘相互接触,请使用形态学处理来使字符间距变大。利用字形来缩减字符的大小,有助于在字符之间创造出空间。

  • 使用二值化来检查非均匀照明问题。使用 graythreshimbinarize 函数对图像进行二值化处理。如果二值化结果中无法看到字符,则该图像可能存在光照不均匀的问题。尝试使用“高顶帽滤波”方法、imtophat 函数,或其他用于消除非均匀照明的技术。

  • 使用 roi 参量来隔离文本。您可以手动指定 roi,也可以使用文本检测功能。

  • 如果您的图像看起来像是一幅包含文字的自然场景(例如街景),而不是扫描的文档,请尝试将 LayoutAnalysis 参量设置为 "Block""Word"

  • 请确保图像中的文字为深色,背景为浅色。要实现这一点,可以在将图像传递给 ocr 函数之前,先对其进行二值化并反相处理。

参考

[1] Smith, Ray. An Overview of the Tesseract OCR Engine. In Ninth International Conference on Document Analysis and Recognition (ICDAR 2007), 629–33. IEEE, 2007. https://doi.org/10.1109/ICDAR.2007.4376991."

[2] Smith, R., D. Antonova, and D. Lee. Adapting the Tesseract Open Source OCR Engine for Multilingual OCR. Proceedings of the International Workshop on Multilingual OCR, (2009).

[3] R. Smith. Hybrid Page Layout Analysis via Tab-Stop Detection. Proceedings of the 10th international conference on document analysis and recognition. 2009.

扩展功能

全部展开

版本历史记录

在 R2014a 中推出

全部展开