-1

我正在开发一个手写识别项目。该项目的要求之一是获取图像输入,该图像仅包含随机位置的一些字符对象,首先我必须提取该字符以进行下一步处理。

现在我对这样一个难题感到困惑:如何从黑白(二进制)图像中提取一个字符,或者如何在黑白(二进制)图像中绘制一个字符的绑定矩形?

非常感谢!

4

3 回答 3

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

于 2011-08-07T18:16:53.187 回答
1

在我的案例中提取字符的更好方法是直方图的分割,我只能与您分享一些论文。

http://cut.by/j7LE8

http://cut.by/PWJf1

可能这可以帮助你

于 2011-08-07T23:32:22.900 回答
0

一个简单的选择是使用详尽的搜索,例如(假设文本为黑色,背景为白色):

  1. 从最左边的列开始,逐步检查所有行是否存在黑色像素。
  2. 当您遇到第一个黑色像素时,将当前列索引保存为left.
  3. 继续遍历列,直到遇到其中没有黑色像素的列,将此列索引保存为right.
  4. 现在以类似的方式遍历行,从最顶行开始,逐步遍历该行中的每一列。
  5. 当您遇到第一个黑色像素时,将当前行索引保存为top.
  6. 继续遍历这些行,直到找到其中没有黑色像素的行,然后将此行保存为 `bottom.

您的角色将包含在由(left - 1, top - 1)左上角和右下角定义的框内(right, bottom)

于 2011-08-07T12:58:51.377 回答