主要内容

使用光学字符识别(OCR)识别文本

方法的使用光学字符识别功能从计算机视觉工具箱™执行光学字符识别。

文本识别光学字符识别函数

识别图像中的文本在图像搜索、文档分析和机器人导航等许多计算机视觉应用中都很有用。的光学字符识别函数提供了一种简单的方法,可以向广泛的应用程序添加文本识别功能。

加载一个图像。I = imread(“businessCard.png”);%执行OCR。结果= ocr(I);显示一个已识别的单词。文字=结果。话说{2}
word = 'MathWorks:'
单词在I中的位置worddbbox = results. worddboundingboxes (2,:)
wordBBox =1×4173 66 376 82
显示单词在原始图像中的位置。图Iname = insertObjectAnnotation(I,“矩形”、wordBBox词);imshow (Iname)

返回的信息光学字符识别函数

光学字符识别函数返回已识别的文本、识别置信度以及文本在原始图像中的位置。您可以使用此信息来识别图像中错误分类的文本的位置。

找到5个置信度最低的字符。[~,idx] = sort(results.CharacterConfidences);lowConfidenceIdx = idx(1:5);获取低置信度字符的包围框位置。lowConfBBoxes = results.CharacterBoundingBoxes(lowConfidenceIdx,:);获得可识别的字符。lowConfChars = results.Text(lowConfidenceIdx)';用低置信度字符注释图像。str ="Character = '"+ lowConfChars +“”;Ilowconf = insertObjectAnnotation(I,“矩形”lowConfBBoxes, str);图imshow(Ilowconf)“最不可靠的字符识别”

在这里,名片中的标志被错误地归类为文本字符。在进行进一步处理之前,可以使用置信度值来识别这类OCR错误。

获得准确结果的挑战

光学字符识别当文本位于统一的背景上,并且格式类似于浅色背景上有深色文本的文档时,性能最佳。当文本出现在不均匀的黑色背景上时,需要额外的预处理步骤来获得最佳的OCR结果。在本例的这一部分中,您将尝试定位小键盘上的数字。尽管对于OCR来说,键盘图像看起来很简单,但它实际上相当具有挑战性,因为文本位于不均匀的黑色背景上。

I = imread(“keypad.jpg”);I = im2gray(I);图imshow(我)

在映像上运行OCR结果= ocr(I);结果。文本
Ans = ' '

结果。文本表示不识别文本。在键盘图像中,文本稀疏,位于不规则的背景上。在这种情况下,启发式用于文档布局分析光学字符识别可能无法在图像中找到文本块,从而导致文本识别失败。在这种情况下,禁用自动布局分析,使用LayoutAnalysis参数,可能有助于改善结果。

%将LayoutAnalysis设置为“Block”,指示ocr假设图像%只包含一个文本块。结果= ocr(I,LayoutAnalysis=“块”);结果。文本
Ans = 0×0空字符数组

哪里出了问题?

调整LayoutAnalysis参数不起作用。要理解为什么OCR继续失败,您必须研究内部执行的初始二值化步骤光学字符识别.你可以使用imbinarize检查初始二值化步骤,因为两者光学字符识别和默认的"global"方法imbinarize使用大津的方法进行图像二值化。

BW = imbinalize (I);图imshowpair (BW,我“蒙太奇”

阈值处理后的二值图像不含文本。这就是为什么光学字符识别无法识别原始图像中的任何文本。您可以通过预处理图像来改进文本分割,从而帮助改善结果。示例的下一部分将探讨两种有用的预处理技术。

图像预处理技术提高结果

上面看到的文字分割不好是由于图像中的背景不均匀造成的,即浅灰色的键被深灰色包围。您可以使用以下预处理技术来去除背景变化并改进文本分割。关于该技术的更多细节在示例中给出纠正不均匀照明和分析前景对象

删除键盘背景。(I,strel()“磁盘”、15));BW1 = imbinalize(我更正了);图imshowpair (BW1,我“蒙太奇”

去除背景变化后,数字现在在二值图像中可见。然而,在键的边缘和数字旁边的小文本有一些伪影,可能会继续阻碍整个图像的精确OCR。额外的预处理使用形态学重建有助于去除这些伪影,并为OCR生成更清晰的图像。

%进行形态重建,显示二值化图像。标记= im(我更正了,strel(“行”10 0));Iclean = imrebuild(标记,Icorrected);Ibinary = imbinalize (Iclean);图imshowpair (Iclean Ibinary,“蒙太奇”

现在,将干净的二值化图像反转,以生成一个在浅色背景上包含深色文本的图像,用于OCR。

BW2 = imcomplement(二进制);图imshowpair (Ibinary BW2,“蒙太奇”

在这些预处理步骤之后,数字现在从背景和光学字符识别产生一些结果。

results = ocr(BW2,LayoutAnalysis=“块”);结果。文本
ans = 'ww] 2 x 3 md ud wb on/ wb wm?- *。0 #) '

除了少数字符外,结果看起来基本上不准确。这是由于键盘上字符大小的差异导致自动布局分析失败。

改进结果的一种方法是利用关于图像中文本的先验知识。在本例中,您感兴趣的文本仅包含数字和*,# '字符。你可以通过约束来改善结果光学字符识别仅从集合“0123456789*#”中选择最佳匹配。

使用“CharacterSet”参数约束OCRresults = ocr(BW2,CharacterSet=“0123456789 * #”);结果。文本
Ans = '2 3 4 78 *0 '

现在的结果更好了,并且只包含给定字符集中的字符。然而,在识别结果中仍有少量图像中感兴趣的字符缺失。

基于roi的处理以改善结果

为了进一步提高这种情况下的识别结果,识别图像中的特定区域光学字符识别应的过程。在键盘示例图像中,这些区域将是仅包含数字、*和#字符的区域。您可以手动使用选择区域imrect,或者您可以将该过程自动化。有关如何自动检测文本区域的信息,请参见使用MSER和OCR自动检测和识别文本而且基于预处理CRAFT网络和OCR的文本自动检测与识别.在本例中,您将使用regionprops在键盘上找到感兴趣的字符。

使用regionprops查找文本区域周围的边界框并测量其面积。cc = bwconncomp(二进制);Stats = regionprops(cc, [“边界框(“大小)“区域”]);从输出统计信息中提取边界框和区域。roi = vertcat(stats(:).BoundingBox);area = vertcat(stats(:).Area);显示所有已连接的区域。img = insertObjectAnnotation(I,“矩形”roi区域,“线宽”3);图;imshow (img);

在这个例子中,最小的字符是数字“1”。使用它的面积来过滤任何异常值。

根据感兴趣的最小字符的区域定义区域约束。areaConstraint = area > 347;%保留满足面积约束的区域。roi = double(roi(areaConstraint,:));在应用区域约束后显示剩余的包围框。img = insertShape(I,“矩形”roi);图;imshow (img);

基于区域长宽比的进一步处理应用于识别可能包含单个字符的区域。这有助于删除在数字旁边混杂在一起的较小的文本字符。一般来说,文本越大越容易光学字符识别认识到。

计算纵横比。宽度= roi(:,3);高度= roi(:,4);aspectRatio =宽度./高度;纵横比在0.25到1.25之间是典型的单个字符因为他们通常不是很矮很宽或很高很瘦。。roi = roi(aspectRatio > 0.25 & aspectRatio < 1.25,:);在应用面积和纵横比约束后显示区域。img = insertShape(I,“矩形”roi);图;imshow (img);

其余区域可以传递到光学字符识别函数,它接受感兴趣的矩形区域作为输入。区域的大小略有增加,以包括文本字符周围的额外背景像素。这有助于改进用于确定背景上文本极性的内部启发式(例如,深色背景上的浅色文本vs.浅色背景上的深色文本)。

numAdditionalPixels = 5;roi(:,1:2) = roi(:,1:2) - numAdditionalPixels;roi(:,3:4) = roi(:,3:4) + 2*numAdditionalPixels;

通过设置禁用自动布局分析功能LayoutAnalysis“没有”。当手动提供ROI输入时,设置LayoutAnalysis“block”,“word”,“textline”,“character”或“none”可能有助于提高结果。确定最优布局分析值需要进行实证分析。

results = ocr(BW2,roi,CharacterSet=“0123456789 * #”LayoutAnalysis =“没有”);

识别的文本可以显示在原始图像上使用insertObjectAnnotation.的deblank函数用于删除任何尾随字符,例如空白或新行。

text = deblank({results.Text});img = insertObjectAnnotation(I,“矩形”、roi、文本);图;imshow (img)

虽然regionprops使您能够在键盘图像中找到数字,它可能不适用于自然场景的图像,其中除了文本之外还有许多对象。对于这些类型的图像,示例中显示的技术基于预处理CRAFT网络和OCR的文本自动检测与识别可以提供更好的文本检测结果。

总结

这个例子展示了如何光学字符识别函数可以用来识别图像中的文本,以及OCR看似简单的图像需要额外的预处理步骤才能产生良好的结果。

参考文献

雷·史密斯。基于制表符停止检测的混合页面布局分析。第十届文件分析与识别国际会议论文集。2009.

相关的话题