Если вы используете MATLAB (что, я надеюсь, так и есть, поскольку оно отлично подходит для подобных задач), я предлагаю вам взглянуть на встроенную функцию bwlabel () и regionprops (). Их должно быть достаточно, чтобы сегментировать все символы и получить информацию об их ограничительной рамке.
Ниже приведен пример кода:
%Read image
Im = imread('im1.jpg');
%Make binary
Im(Im < 128) = 1;
Im(Im >= 128) = 0;
%Segment out all connected regions
ImL = bwlabel(Im);
%Get labels for all distinct regions
labels = unique(ImL);
%Remove label 0, corresponding to background
labels(labels==0) = [];
%Get bounding box for each segmentation
Character = struct('BoundingBox',zeros(1,4));
nrValidDetections = 0;
for i=1:length(labels)
D = regionprops(ImL==labels(i));
if D.Area > 10
nrValidDetections = nrValidDetections + 1;
Character(nrValidDetections).BoundingBox = D.BoundingBox;
end
end
%Visualize results
figure(1);
imagesc(ImL);
xlim([0 200]);
for i=1:nrValidDetections
rectangle('Position',[Character(i).BoundingBox(1) ...
Character(i).BoundingBox(2) ...
Character(i).BoundingBox(3) ...
Character(i).BoundingBox(4)]);
end
Изображение, которое я прочитал здесь, от 0 до 255, поэтому я должен пороговое значение, чтобы сделать его двоичным. Так как точки выше i и j могут быть проблемой, я также порождаю количество пикселей, которые составляют отдельную область.
Результат можно увидеть здесь:
https://www.sugarsync.com/pf/D775999_6750989_128710