主要内容

使用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);图imshow(我)情节(mserRegions“showPixelList”,真的,“showEllipses”、假)标题(“女士地区”)举行

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

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

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

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

  • 纵横比

  • 偏心

  • 欧拉数

  • 程度上

  • 可靠性

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

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

图中包含一个axes对象。基于几何属性去除非文本区域后的标题轴对象包含1042个类型为图像、直线的对象。

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

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

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

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

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

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

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

%计算行程宽度变化度量strokeWidthValues = distanceImage (skeletonImage);strokeWidthMetric =性病(strokeWidthValues) /意味着(strokeWidthValues);

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

%阈值行程宽度变化度量strokeWidthThreshold = 0.4;strokeWidthFilterIdx = strokeWidthMetric >;

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

处理剩余区域j = 1:numel(mserStats) regionImage = mserStats(j).Image;regionImage = padarray(regionImage, [1 1], 0);distanceImage = bwdist (~ regionImage);skeletonImage = bwmorph (regionImage,“薄”、正);strokeWidthValues = distanceImage (skeletonImage);strokeWidthMetric =性病(strokeWidthValues) /意味着(strokeWidthValues);strokeWidthFilterIdx(j) = strokeWidthMetric > strokeWidthThreshold;结束根据笔画宽度的变化移除区域。mserRegions (strokeWidthFilterIdx) = [];mserStats (strokeWidthFilterIdx) = [];%显示剩余区域图imshow(我)情节(mserRegions“showPixelList”,真的,“showEllipses”、假)标题(“在删除基于笔画宽度变化的非文本区域后”)举行

图中包含一个axes对象。基于笔画宽度变化去除非文本区域后的标题轴对象包含1032个类型为图像、直线的对象。

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

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

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

为所有区域获取边界框bboxes = vertcat (mserStats.BoundingBox);%从[x y宽度高度]边框格式转换为[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)标题(“扩展边框文本”

图中包含一个axes对象。标题为“扩展边框文本”的axis对象包含一个类型为image的对象。

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

使用bboxOverlapRatio函数计算所有扩展边界框的成对重叠比,然后使用找出所有的连通区域。

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

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

根据最小和最大尺寸合并方框。。xmin = accumarray(componentindexes ', xmin, [], @min);ymin = accumarray(componentindexes ', ymin, [], @min);xmax = accumarray(componentindexes ', xmax, [], @max);ymax = accumarray(componentindexes ', 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)标题(“发现文本”

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

步骤5:使用OCR识别检测到的文本

在检测到文本区域之后,使用光学字符识别函数识别每个边界框内的文本。注意,如果不首先找到文本区域,则光学字符识别函数的噪声会大得多。

ocr = ocr(I, textBBoxes);[ocrtxt。文本)
ans = '需要特殊泊车牌的未授权车辆可被拖走,费用由车主承担。'

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

参考文献

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

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

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

诺伊曼,卢卡斯,和吉里·马塔斯。“实时场景文本定位与识别。”计算机视觉与模式识别(CVPR), 2012 IEEE会议。IEEE 2012。

参考文献

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

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

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

诺伊曼,卢卡斯,和吉里·马塔斯。“实时场景文本定位与识别。”计算机视觉与模式识别(CVPR), 2012 IEEE会议。IEEE 2012。

相关的话题

Baidu
map