簡體   English   中英

為整個單詞而不是圖像中的每個字符繪制邊界框-MATLAB

[英]Draw bounding boxes for entire word instead of each character in an image - 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

我想你有個好主意。 您將信箱分組為單詞,然后計算每組的邊界框。

在您的特定示例中,您可以通過形態學閉合非常快地完成此操作。 我在這里不解釋如何計算單詞間距,您只需要字符間距,它是所使用字體的參數。 我將此參數稱為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

這實際上很簡單。 將矩形繪制到二進制圖像上,然后填寫所有矩形。 之后,使用結構元素進行二進制形態封閉,該結構元素足夠大以在兩個字符之間重疊。 當您這樣做時,每個單詞中都將帶有掩碼。 然后,您可以使用bwlabel提取每個完整單詞的ID。 擁有ID后,您可以遍歷並為每個單詞創建單獨的掩碼。 如果您需要一些代碼,我可以編輯我的帖子,但這應該可以幫助您入門。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM