MATLAB:从二进制图像中分割单个字母

标签 matlab image-processing computer-vision

我正在从事一个光学字符识别项目,我正在尝试创建一个程序来识别图像中的字母。我正在按照 Mathworks ( Digit Classification) 上的教程进行操作。在他们的示例中,他们的训练图像已经分开。不幸的是,我得到的训练图像在一个文件中包含数百个字母。

这是一个示例:

我需要一种有效的方法来将每个单独的字母分割成图像,因此我将有一个 26Xn 数组,其中 26 是字母表中的每个字母,n 是包含单个字母的 n 个图像数据变量。从每个训练图像中手动分割字母或尝试按指定长度分割字母将非常乏味,因为字母之间的间隔并不总是相等的。

有谁知道 MATLAB 函数或一种简单的方法,我可以通过这种方法识别每个连续的白色对象的高度和长度,并将所有带有黑色背景的单个白色对象存储在上述 26Xn 数组中(或至少存储在某种类型的数组中以便我稍后可以将它处理成 26xn 数组)?

最佳答案

如果你想提取图像中的每一个单独的字符,你可以很容易地使用 regionprops 来做到这一点。 .只需使用 BoundingBox 属性来提取每个字符周围的边界框。执行此操作后,我们可以将每个字符放入 cell 数组中以供进一步处理。如果您想将其存储到 26 x N 数组中,您需要识别每个字母的第一个字母,以便您可以选择字母应该进入第一维的插槽。因为你想先分割出字符,所以我们会专注于此。因此,让我们将图像加载到 MATLAB 中。请注意,原始图像是 GIF 格式的,当我将其加载到我的计算机上时……它看起来很乱。我已将图像重新保存为 PNG,如下所示:

enter image description here

让我们将其读入 MATLAB:

im = imread('http://i.stack.imgur.com/q7cnA.png');

现在,您可能会注意到某些字母之间存在一些不连续性。我们可以做的是进行形态学开运算来缩小这些差距。但是,我们不会使用此图像来提取实际字符。我们只使用这些来获取字母的边界框:

se = strel('square', 7);
im_close = imclose(im, se);

现在,您可以像这样调用 regionprops 来查找图像中的所有边界框(在应用形态学之后):

s = regionprops(im_close, 'BoundingBox');

s 中返回的是一个结构,该结构中的每个元素都包含一个边界框,该边界框封装了在图像中检测到的对象。在我们的例子中,这是一个单一的角色。每个对象的 BoundingBox 属性是一个 4 元素数组,格式如下:

[x y w h]

(x,y) 是边界框左上角的列和行坐标,wh是边界框的宽度和高度。我们接下来要做的是创建一个 4 列矩阵,将所有这些边界框属性封装在一起,其中每一行表示一个边界框:

bb = round(reshape([s.BoundingBox], 4, []).');

有必要对值进行四舍五入,因为如果您想从图像中提取字母,我们必须在整数坐标中执行此操作,因为这是自然定义图像的方式。如果您想很好地说明这些边界框,下面的代码将在我们检测到的每个字符周围绘制一个红色框:

imshow(im);
for idx = 1 : numel(s)
    rectangle('Position', bb(idx,:), 'edgecolor', 'red');
end

这是我们得到的:

enter image description here

最后的工作是提取所有字符并将它们放入cell 数组中。我正在使用 cell 数组,因为字符大小不均匀,因此将其放入 cell 数组将适应不同的大小。因此,只需遍历我们拥有的每个边界框,然后提取像素边界框以获取每个字符并将其放入元胞数组中。因此:

chars = cell(1, numel(s));
for idx = 1 : numel(s)
    chars{idx} = im(bb(idx,2):bb(idx,2)+bb(idx,4)-1, bb(idx,1):bb(idx,1)+bb(idx,3)-1);
end

如果你想要一个字符,只需执行 ch = chars{idx}; 其中 idx 是从 1 到我们拥有的字符数之间的任意数字。您还可以通过 imshow(ch);

查看这个角色的样子

希望这足以让您入门。祝你好运!

关于MATLAB:从二进制图像中分割单个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26645067/

相关文章:

c++ - 如何在重载运算符中使用函数指针

java - 从图像中提取文本

python - 使用 Python OpenCV 从图像中删除边框

matlab - 图像膨胀错误

matlab - libSVM 输出 "Line search fails in two-class probability estimates"

graph-theory - 使用Matlab的dijkstra算法

matlab - 有没有办法获取在 Matlab 中运行的本地函数的名称?

matlab - 主 GUI 和子 GUI 之间的关系

c# - C# 中用于人脸检测的图像腐 eclipse

python - 如何使用SIFT从数据集中提取相同大小的特征向量?