主要内容

使用预先训练的CRAFT网络和OCR自动检测和识别文本

本例展示了如何使用字符区域感知文本检测(CRAFT)深度学习模型和光学字符识别(OCR)进行文本识别。在本例中,您使用预先训练的CRAFT深度学习网络来检测输入图像中的文本区域。您可以修改CRAFT模型的区域阈值和亲和阈值,以本地化整个段落、句子或单词。然后,使用OCR来识别检测到的文本区域中的字符。

读取图像

读取图像到MATLAB®工作区。

我= imread (“handicapSign.jpg”);

检测文本区域

方法检测输入图像中的文本区域detectTextCRAFT函数。的CharacterThreshold值是用于定位图像中的每个字符的区域阈值。的LinkThreshold值是关联阈值,该阈值定义将两个检测到的文本分组到单个实例的得分。通过修改区域和亲和性阈值,可以对检测结果进行微调。增加更多词级和字符级检测的亲和阈值。有关亲和力阈值对检测结果的影响的信息,请参见通过修改亲和性阈值检测字符的例子。

要检测停车标志上的每个单词,请将区域阈值的值设置为0.3。默认值为0.4。输出是一组边界框,用于定位图像场景中的单词。包围框指定图像中检测到的文本区域的空间坐标。

bbox = detectTextCRAFT(我CharacterThreshold = 0.3);

方法在图像上绘制输出边界框insertShape函数。

Iout = insertShape(我“矩形”bbox,线宽= 4);

显示输入图像和输出文本检测。

图=图(位置=[1 1 600 600]);甘氨胆酸ax =;蒙太奇({我;Iout},父= ax);标题(输入图像|检测到的文本区域

图中包含一个axes对象。标题为Input Image | Detected Text Regions的axes对象包含一个Image类型的对象。

识别文本

方法识别边界框内的文本光学字符识别函数和显示结果。输出是ocrText对象,该对象包含有关已识别文本、识别置信度和文本在原始图像中的位置的信息。

输出= ocr(我bbox);

显示识别的单词。

disp ([output.Words])
列1至4 {'SPECIAL'} {'MAY'} {'unififfioiglgen'} {'HANoIcI§I_>I_>…'}第5至8列{'E' e_ (v)U|R\E|3'} {'VEHICLES'} {'FARKING'} {'EXPENSE'}第9至11列{" owuens'} {'TOWED'} {'PLATE'}

分析识别结果

停车标志上的13个单词中只有6个被正确识别。这句话未经授权的残疾要求停车,主人没有被正确识别。OCR方法的性能取决于文本检测结果和图像背景特征。作为预处理步骤,光学字符识别函数执行二值化来从背景中分割文本区域。为了获得良好的分割结果,图像背景必须均匀,文本区域必须与背景有较高的对比度。否则,分割后的文本区域可能存在异常值,进而影响识别结果。

您可以使用imbinarize函数检查初始二值化步骤,因为两者都光学字符识别默认值是'全球的方法imbinarize采用大津法进行图像二值化。

Idet =细胞(1、大小(bbox, 1));Iseg =细胞(1、大小(bbox, 1));I =1:size(bbox,1) ROI = bbox(I,:);Idet{我}=我(roi (2): roi (2) + roi (4), roi (1): roi (1) + roi (3):);Iseg{我}= imbinarize (rgb2gray (Idet{我}));结束

显示使用获得的文本检测detectTextCRAFT函数和相应的分割结果。您可以注意到与单词对应的分段文本区域未经授权的残疾,要求包含异常值。

图一=图;set(fig1,Position=[1 1 900 400]) hPanel1 = uipanel(fig1,Position=[0 0 0.5 1]);hPlot1 =轴(hPanel1);hPanel2 = uipanel(fig1,Position=[0.5 0 0.5 1]);hPlot2 =轴(hPanel2);蒙太奇(Idet、家长= hPlot1)蒙太奇(Iseg、家长= hPlot2)标题(“分割文本区域”、家长= hPlot2)

{

提高识别结果

为了提高识别结果,对检测到的文本区域进行预处理,使输入变为光学字符识别是良好的局部检测,没有异常值。

方法计算紧密本地化的检测,从而减少分割文本区域中的异常值数量detectTextCRAFT函数。增加区域阈值的值,以减少错误检测的数量,并计算将图像中的文本区域紧密本地化的边界框。设置的值CharacterThreshold参数为0.55,并计算文本检测。默认值为0.4。

newBbox = detectTextCRAFT(我CharacterThreshold = 0.55);

方法在图像上绘制输出边界框insertShape函数。显示检测结果。您可以注意到,图像中的文本区域是紧密本地化的。

Iout = insertShape(我“矩形”newBbox,线宽= 3);图imshow (Iout)标题(检测到的文本区域阈值= 0.55

图中包含一个axes对象。标题为Detected Text Regions for Region Threshold = 0.55的axes对象包含一个类型为image的对象。

方法识别边界框内的文本光学字符识别功能和显示识别的单词。

输出= ocr(我newBbox);disp ([output.Words])
第1至4列{'特殊'}{'未经授权'}{'残疾人'}{'必需'}第5至8列{'车辆'}{'停车'}{'费用'}{'车牌'}

停车标志上的字是可以被正确识别的,除了这些小字:五月,.这是因为边界框太紧,OCR无法检测小长度的单词。

按照这些预处理步骤可以进一步提高识别精度。

  • 使用调整检测到的文本区域的对比度imadjust函数。当输入图像为低对比度图像时,对比度增强可提高分割精度。

  • 将文本区域从图像背景中分割出来imbinarize函数。您还可以使用其他分割方法,如k-means聚类或基于图像场景复杂性的自适应阈值分割。

  • 沿着图像边界添加更多像素来填充图像。如果前景文本区域的强度值为1那么填充像素值必须为0反之亦然。

  • 执行形态侵蚀以删除分割文本区域中的小异常值(如果有的话)。

方法识别边界框内的文本光学字符识别函数。若要删除空格,请使用deblank函数。

浏览Icorrect =细胞(1、大小(newBbox 1));finalOutput =细胞(1、大小(newBbox 1));recognizedWords =细胞(1、大小(newBbox 1));i=1:size(newBbox,1) roi = newBbox(i,:);Icrop =我(roi (2): roi (2) + roi (4), roi (1): roi (1) + roi (3):);Ipreprocess = rgb2gray (Icrop);Ipreprocess = imadjust (Ipreprocess);Isegment = imbinarize (Ipreprocess);Isegment = padarray(Isegment,[15 15],0,“两个”);se = strel (“广场”2);{我}=浏览Icorrect imerode (Isegment se);finalOutput{我}= ocr(浏览Icorrect{我});recognizedWords{我}= [deblank (finalOutput{我}。text)];结束

显示分割结果。现在的文本检测是紧密本地化的,分割后的文本没有任何异常值。分段文本区域的面积也因为填充而增加了。

figure(Position=[1 1 400 400]);甘氨胆酸ax3 =;蒙太奇(浏览Icorrect、家长= ax3)标题(“分割文本区域”

图中包含一个axes对象。标题为分段文本区域的axis对象包含一个类型为image的对象。

显示结果,并在停车标志上标注识别的单词。

disp (recognizedWords)
第1至5列{'SPECIAL'} {'MAY'} {'UNAUTHORIZED'} {'HANDICAPPED'} {'AT'}第6至10列{'REQUIRED'} {'VEHICLES'} {'PARKING'} {'EXPENSE'} {'BE'}第11至13列{'OWNERS'}{'拖车'}{'PLATE'}
Iannotate =我;问= 1:尺寸(finalOutput, 2)如果~isempty(finalOutput{cnt}.Words) iannotation = insertObjectAnnotation(iannotation,“矩形”newBbox(问:),finalOutput{问}.Words,字形大小= 18);结束结束图imshow (Iannotate)

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

另请参阅

||||||

相关的话题

Baidu
map