检测黑/白或二进制图像中的字符或对象的矩形边界

时间:2011-08-07 12:46:27

标签: image image-processing pattern-recognition image-segmentation

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

现在我混淆了这样一个难题:如何从黑/白(二进制)图像中提取一个字符,或者如何在黑白(二进制)图像中绘制一个字符的边界矩形?

非常感谢!

3 个答案:

答案 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)

在我的案例中提取角色的更好方法是直方图的分割我只能与你分享一些论文。

http://cut.by/j7LE8

http://cut.by/PWJf1

可能这可以帮到你

答案 2 :(得分:0)

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

  1. 从最左边的列开始,逐步检查所有行,检查黑色像素。
  2. 遇到第一个黑色像素时,请将当前列索引保存为left
  3. 继续遍历列,直到遇到其中没有黑色像素的列,将此列索引保存为right
  4. 现在以类似的方式遍历行,从最上面的行开始,逐步遍历该行中的每一列。
  5. 遇到第一个黑色像素时,请将当前行索引保存为top
  6. 继续遍历行,直到找到其中没有黑色像素的行,并将此行另存为“底部。
  7. 您的角色将包含在(left - 1, top - 1)左上角定义的框中,(right, bottom)作为右下角。