我正在开发一个手写识别项目。这个项目的一个要求是获取图像输入,这个图像只包含一个随机位置的字符对象,首先我必须提取这些字符以便在下一步处理。
现在我混淆了这样一个难题:如何从黑/白(二进制)图像中提取一个字符,或者如何在黑白(二进制)图像中绘制一个字符的边界矩形?
非常感谢!
答案 0 :(得分:2)
如果您正在使用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
答案 1 :(得分:1)
答案 2 :(得分:0)
一个简单的选择是使用详尽的搜索,例如(假设文本为黑色,背景为白色):
left
。right
。top
。您的角色将包含在(left - 1, top - 1)
左上角定义的框中,(right, bottom)
作为右下角。