主要内容

使用MSER和OCR自动检测和识别文本

这个例子展示了如何通过使用最大稳定极值区域(MSER)特征检测器检测包含文本的图像中的区域。这是在非结构化场景中执行的一个常见任务。非结构化场景是包含不确定或随机场景的图像。例如,你可以从捕捉到的视频中自动检测和识别文本,提醒司机注意路标。这与结构化场景不同,结构化场景包含已知的场景,其中文本的位置是事先知道的。

从非结构化场景中分割文本极大地帮助完成额外的任务,如光学字符识别(OCR)。本例中的自动文本检测算法检测大量文本区域候选,并逐步删除那些不太可能包含文本的区域。

步骤1:使用MSER检测候选文本区域

MSER特征检测器可以很好地查找文本区域[1]。它适用于文本,因为一致的颜色和高对比度的文本导致稳定的强度配置文件。

使用detectMSERFeatures函数查找图像内的所有区域并绘制这些结果。注意,在文本旁边检测到许多非文本区域。

colorImage = imread(“handicapSign.jpg”);I = im2gray(colorImage);检测MSER区域。[mserRegions, mserConnComp] = detectMSERFeatures(I,...“RegionAreaRange”(200 8000),“ThresholdDelta”4);figure imshow(I) hold住情节(mserRegions“showPixelList”,真的,“showEllipses”、假)标题(“女士地区”)举行

图中包含一个轴对象。带有标题MSER区域的axes对象包含1120个类型为image、line的对象。

步骤2:基于基本几何属性移除非文本区域

虽然MSER算法挑出了大部分文本,但它也检测出图像中许多其他稳定的非文本区域。可以使用基于规则的方法删除非文本区域。例如,文本的几何属性可以用于使用简单阈值过滤非文本区域。或者,您可以使用机器学习方法来训练文本与非文本分类器。通常,这两种方法的组合会产生更好的结果[4]。这个例子使用了一个简单的基于规则的方法来过滤基于几何属性的非文本区域。

有几个几何属性可以很好地区分文本和非文本区域[2,3],包括:

  • 纵横比

  • 偏心

  • 欧拉数

  • 程度上

  • 可靠性

使用regionprops测量其中的一些属性,然后根据它们的属性值删除区域。

%使用区域道具测量MSER属性mserStats = regionprops(mserConnComp,的边界框(“大小)“偏心”...“稳健”“程度”“欧拉”“图像”);使用包围框数据计算纵横比。bbox = vertcat(mserStats.BoundingBox);W = bbox(:,3);H = bbox(:,4);aspectRatio = w /h;阈值的数据,以确定哪些区域要删除。这些阈值%可能需要针对其他映像进行调整。filterIdx = aspectRatio' > 3;filterIdx = filterIdx | [mserStats. sh]偏心量]> .995;filterIdx = filterIdx | [mserStats. sh]硬度]< .3;filterIdx = filterIdx | [mserStats. sh][mserStats. Extent] < 0.2 | [mserStats. Extent]Extent] > 0.9;filterIdx = filterIdx | [mserStats. sh]EulerNumber] < -4;移除区域mserStats(filterIdx) = [];mserRegions(filterIdx) = [];%显示剩余区域figure imshow(I) hold住情节(mserRegions“showPixelList”,真的,“showEllipses”、假)标题(“基于几何属性移除非文本区域后”)举行

图中包含一个轴对象。标题为“After remove Non-Text Regions Based On Geometric Properties”的坐标轴对象包含1042个image、line类型的对象。

步骤3:根据笔画宽度变化去除非文本区域

另一个用来区分文本和非文本的常用度量是笔画宽度。笔划宽度是构成字符的曲线和线条宽度的度量。文本区域的笔画宽度变化较小,而非文本区域的笔画宽度变化较大。

为了帮助理解如何使用笔画宽度来删除非文本区域,请估计检测到的MSER区域之一的笔画宽度。你可以通过使用距离变换和二元细化操作[3]来做到这一点。

获取一个区域的二值图像,并填充它以避免边界效应%在行程宽度计算。regionImage = mserStats(6).Image;regionImage = padarray(regionImage, [1 1]);计算描边宽度图像。distanceImage = bwdist(~regionImage);skeletonImage = bwmorph(regionImage,“薄”、正);strokeWidthImage = distanceImage;strokeWidthImage(~skeletonImage) = 0;在描边宽度图像旁边显示区域图像。图subplot(1,2,1) imagesc(regionImage) title(地区形象的) subplot(1,2,2) imagesc(strokeWidthImage)“描边宽度图像”

图中包含2个轴对象。标题为Region Image的Axes对象1包含一个Image类型的对象。标题为Stroke Width Image的坐标轴对象2包含一个Image类型的对象。

在上面显示的图像中,注意笔画宽度图像在大部分区域上的变化很小。这表明该区域更有可能是文本区域,因为组成该区域的线条和曲线都具有相似的宽度,这是人类可读文本的共同特征。

为了使用笔画宽度变化来使用阈值删除非文本区域,整个区域的变化必须量化为单个度量,如下所示:

计算行程宽度变化度量strokeWidthValues = distanceImage(skeletonImage);strokeWidthMetric = std(strokeWidthValues)/mean(strokeWidthValues);

然后,可以应用一个阈值来删除非文本区域。注意,这个阈值可能需要针对不同字体样式的图像进行调优。

冲程宽度变化度量的阈值strokeWidthThreshold = 0.4;strokeWidthFilterIdx = strokeWidthMetric > strokeWidthThreshold;

上面所示的过程必须分别应用于每个检测到的MSER区域。下面的for循环处理所有区域,然后显示使用笔画宽度变化删除非文本区域的结果。

%处理剩余的区域j = 1: nummel (mserStats) regionImage = mserStats(j).Image;regionImage = padarray(regionImage, [1 1], 0);distanceImage = bwdist(~regionImage);skeletonImage = bwmorph(regionImage,“薄”、正);strokeWidthValues = distanceImage(skeletonImage);strokeWidthMetric = std(strokeWidthValues)/mean(strokeWidthValues);strokeWidthFilterIdx(j) = strokeWidthMetric > strokeWidthThreshold;结束根据描边宽度的变化去除区域mserRegions(strokeWidthFilterIdx) = [];mserStats(strokeWidthFilterIdx) = [];%显示剩余区域figure imshow(I) hold住情节(mserRegions“showPixelList”,真的,“showEllipses”、假)标题(“基于笔画宽度变化删除非文本区域后”)举行

图中包含一个轴对象。标题为“After remove Non-Text region After基于Stroke Width Variation”的坐标轴对象包含了1032个image、line类型的对象。

步骤4:合并文本区域以获得最终检测结果

此时,所有的检测结果都由单个文本字符组成。要将这些结果用于OCR等识别任务,必须将单个文本字符合并为单词或文本行。这使得识别图像中的实际单词成为可能,这些单词比单个字符携带更多有意义的信息。例如,识别字符串'EXIT'与单个字符{'X','E','T','I'}的集合,如果没有正确的顺序,单词的含义就会丢失。

将单个文本区域合并为单词或文本行的一种方法是首先找到相邻的文本区域,然后在这些区域周围形成边界框。若要查找邻近区域,请展开前面计算的包围框regionprops.这将使相邻文本区域的边界框重叠,从而使属于同一单词或文本行的文本区域形成重叠的边界框链。

为所有区域获取边界框bboxes = vertcat(mserStats.BoundingBox);%从[x y width height]边框格式转换为[xmin ymin .% xmax ymax]格式方便。Xmin = bboxes(:,1);Ymin = bboxes(:,2);Xmax = xmin + bboxes(:,3) - 1;Ymax = ymin + bboxes(:,4) - 1;稍微扩展边界框。expansionAmount = 0.02;xmin = (1-expansionAmount) * xmin;ymin = (1-expansionAmount) * ymin;xmax = (1+expansionAmount) * xmax;ymax = (1+expansionAmount) * ymax;将边界框剪辑到图像边界内Xmin = max(Xmin, 1);Ymin = max(Ymin, 1);xmax = min(xmax, size(I,2));ymax = min(ymax, size(I,1));显示展开的包围框expdedbboxes = [xmin ymin xmax-xmin+1 ymax-ymin+1];IExpandedBBoxes = insertShape(colorImage,“矩形”expandedBBoxes,“线宽”3);图imshow(IExpandedBBoxes)“扩展边界框文本”

图中包含一个轴对象。标题为Expanded Bounding Boxes Text的axes对象包含一个image类型的对象。

现在,可以将重叠的边界框合并在一起,围绕单个单词或文本行形成单个边界框。为此,计算所有包围框对之间的重叠比。这量化了所有文本区域对之间的距离,从而可以通过寻找非零重叠比来找到相邻文本区域组。计算完成对重叠比后,使用a找出所有由非零重叠比“连接”的文本区域。

使用bboxOverlapRatio函数计算所有扩展包围框的成对重叠比,然后使用找到所有相连的区域。

%计算重叠率overlapRatio = bboxOverlapRatio(expandedBBoxes, expandedBBoxes);设置边界框与自身的重叠率为0简化图形表示。n = size(overlapRatio,1);overlapRatio(1:n+1:n²)= 0;创建图形g = graph(overlapRatio);查找图中连接的文本区域componentIndices = conncomp(g);

的输出conncomp每个包围框所属的连接文本区域的索引。使用这些索引,通过计算组成每个连接组件的各个包围框的最小值和最大值,将多个相邻的包围框合并为单个包围框。

根据最小和最大尺寸合并方框。。xmin = accumarray(componentIndices', xmin, [], @min);ymin = accumarray(componentIndices', ymin, [], @min);xmax = accumarray(componentIndices', xmax, [], @max);ymax = accumarray(componentIndices', ymax, [], @max);使用[x y width height]格式组合合并的包围框。textBBoxes = [xmin ymin xmax-xmin+1 ymax-ymin+1];

最后,在显示最终检测结果之前,通过删除仅由一个文本区域组成的包围框来抑制虚假文本检测。这将删除不太可能是实际文本的孤立区域,因为文本通常是分组的(单词和句子)。

删除只包含一个文本区域的包围框numRegionsInGroup = histcounts(componentIndices);textBBoxes(numRegionsInGroup == 1,:) = [];显示最终的文本检测结果。ITextRegion = insertShape(colorImage,“矩形”textBBoxes,“线宽”3);图imshow(ITextRegion)“发现文本”

图中包含一个轴对象。标题为Detected Text的axes对象包含一个image类型的对象。

第五步:使用OCR识别检测到的文本

检测到文本区域后,使用光学字符识别函数识别每个包围框内的文本。方法的输出不需要首先查找文本区域光学字符识别函数的噪声会大得多。

ocrtxt = ocr(I, textBBoxes);[ocrtxt。文本)
“未授权车辆可被拖走,费用由车主承担”

这个示例向您展示了如何使用MSER特征检测器检测图像中的文本,首先找到候选文本区域,然后描述了如何使用几何测量来删除所有非文本区域。此示例代码是开发更健壮的文本检测算法的良好起点。注意,在没有进一步增强的情况下,这个示例可以为各种其他图像(例如posts .jpg或licensePlates.jpg)生成合理的结果。

参考文献

[1]陈慧忠,等。“具有边缘增强最大稳定极值区域的自然图像中的鲁棒文本检测。”图像处理(ICIP), 2011第18届IEEE国际会议。IEEE 2011。

[2]冈萨雷斯,阿尔瓦罗,等。“复杂图像中的文本位置。”模式识别(ICPR), 2012年第21届国际会议。IEEE 2012。

[3]李,姚,陆虎川。“通过笔画宽度检测场景文本。”模式识别(ICPR), 2012年第21届国际会议。IEEE 2012。

Neumann, Lukas,和Jiri Matas。“实时场景文本定位和识别。”计算机视觉与模式识别(CVPR), 2012年IEEE会议。IEEE 2012。

参考文献

[1]陈慧忠,等。“具有边缘增强最大稳定极值区域的自然图像中的鲁棒文本检测。”图像处理(ICIP), 2011第18届IEEE国际会议。IEEE 2011。

[2]冈萨雷斯,阿尔瓦罗,等。“复杂图像中的文本位置。”模式识别(ICPR), 2012年第21届国际会议。IEEE 2012。

[3]李,姚,陆虎川。“通过笔画宽度检测场景文本。”模式识别(ICPR), 2012年第21届国际会议。IEEE 2012。

Neumann, Lukas,和Jiri Matas。“实时场景文本定位和识别。”计算机视觉与模式识别(CVPR), 2012年IEEE会议。IEEE 2012。

相关的话题