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