【问题标题】:Draw bounding boxes for entire word instead of each character in an image - MATLAB为整个单词而不是图像中的每个字符绘制边界框 - MATLAB
【发布时间】:2014-05-16 14:57:10
【问题描述】:

我有一个 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

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

    在您的特定示例中,您可以通过形态关闭非常快速地完成此操作。我这里不解释如何计算字间距,你只需要字符间距,它是所用字体的一个参数。我称这个参数为 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。基本上是我的想法,但我没有时间把它写成代码。干得好。
    • @Bentoy13 好吧,我的错。我将 Sp 的值修改为 10,现在它给了我不错的结果。尽管在某些情况下,它仍然缺少单词中的某些字母。喜欢imgur.com/IAqMRlB
    • 好的,到这里就完美了。调整了strel的参数,非常感谢! :)
    • @KanishkaGanguly 很高兴知道它有效。内核的调整是取得好成绩的关键。在某些情况下,这可能还不够(例如,从单词中分离标点符号),然后可能需要其他更复杂的步骤。
    • @Bentoy13,是的,完全正确。标点符号仍被视为单词的一部分。虽然,就目前而言,这没关系。不过,我还有另一个相关的问题。 stackoverflow.com/questions/23709210/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-11-23
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2014-10-29
      • 2017-10-21
      • 2018-11-26
      • 2013-08-30
      • 2021-10-29
      相关资源
      最近更新 更多