为整个单词绘制边界框而不是图像中的每个字符 - MATLAB

时间:2014-05-16 14:57:10

标签: matlab

我有一个MATLAB代码,可以在每个字母周围绘制边界框。

我想在每个单词周围绘制这些框,而不是每个单词。

我曾想过

  • 读取单词之间每个空格的大小,并根据该单词分隔每个单词。
  • 将相邻的矩形分组为更大的矩形,这对我来说基本上也是如此。

如何做到这一点?


以下是目前的图片:

http://imgur.com/iDF5VD4

到目前为止,这是我的代码:

%CLEAR EVERYTHING
clear all;
close all;

%SET FOLDER AND FILE LOCATION
folder = 'H:\Miscellaneous\Work\Project';
baseFileName = 'lorem-ipsum.jpg';
fullFile = fullfile(folder, baseFileName);

%CONVERT TO GRAYSCALE
normal = imread(fullFile);
gray = rgb2gray(normal);

%CONVERT TO BINARY IMAGE
binary = im2bw(gray);

%INVERT IMAGE
binary = ~binary;

%FILL HOLES
ifill=imfill(binary,'holes');
figure,imshow(ifill)

%COUNT LETTER IN TEXT
[Ilabel num]=bwlabel(ifill);
disp(num)

%CALCULATE REGION PROPERTIES
Iprops=regionprops(Ilabel);

%SET BOX PROPERTIES INTO VARIABLE
Ibox=[Iprops.BoundingBox];

%RESHAPE 1-D ARRAY
Ibox=reshape(Ibox,[4 num]);

%DRAW BOUNDING BOXES FOR EACH LETTER
for cnt=1:num
    rectangle('position',Ibox(:,cnt),'edgecolor','r');
end
hold off

2 个答案:

答案 0 :(得分:4)

我认为你有个好主意。您将字母框分组为单词,然后计算每个组的边界框。

在您的特定示例中,您可以通过形态学关闭快速完成此操作。我在这里不解释如何计算单词间距,你只需要字符间距,它是使用字体的参数。我把这个参数称为Sp。在你的图像上,Sp似乎大约是4个像素。

所以,首先拍摄你的二进制图像;请注意,填充孔非常有趣。通过形态学关闭,您可以直接在字母上工作,无需使用其边界框。

binclosed = imclosed(binary, strel('rectangle',[2 ceil(Sp/2)]));

在这里,我用一个高度为2的矩形关闭,以便例如捕捉到' i')。

然后,您可以标记连接的组件,并像处理字符一样绘制边界框。

[Ilabel,num] = bwlabel(binclosed);
Iprops = regionprops(Ilabel, 'BoundingBox');
Ibox = reshape([Iprops.BoundingBox],[4 num]);
for cnt=1:num
    rectangle('position',Ibox(:,cnt),'edgecolor','r');
end

答案 1 :(得分:1)

实际上这很简单。将矩形绘制到二进制图像上,然后填充矩形的全部。之后,使用足够大的结构元素进行二元形态学闭合,以便在两个字符之间重叠。当你这样做时,你会在每个单词中都有面具。然后,您可以使用bwlabel提取每个完整单词的ID。获得ID后,您可以迭代并为每个单词创建单独的掩码。如果你需要一些代码,我可以编辑我的帖子,但这应该让你开始。