在MATLAB中使用白色边界分割二进制图像

时间:2014-11-17 03:51:17

标签: matlab image-processing computer-vision ocr matlab-cvst

我试图在MATLAB中使用OCR将this image中的值读入变量。我很难这样做,所以我尝试使用白色边界线将这个图像分成更小的部分,然后尝试读取它,但我不知道该怎么做。任何帮助将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:1)

如果块总是由完全垂直的线界定,您可以通过将原始图像(此处从RGB转换为灰度为单个平面)与由第一个重复的矩阵进行比较来找到它们的位置。仅原始图像的一行。由于线是垂直的,因此第一行中像素的强度将始终相同。这会生成一个二进制掩码,可以与快速阈值处理结合使用,以拒绝那些在每一行中都是黑色像素的行。然后反转此掩码并使用regionprops找到每个区域的边界框。然后你可以把它们拿出来做你喜欢的事。

如果划分文本块的线在整个过程中并不总是垂直或恒定的强度,那么需要做更多的工作来定位分界线,但没有什么是不可能的。但是,在这种情况下,一些示例数据会很好。

img = imread('http://puu.sh/cU3Nj/b020b60f0b.png');

imshow(img);

imgGray = rgb2gray(img);
imgMatch = imgGray == repmat(imgGray(1,:), size(imgGray, 1), 1);
whiteLines = imgMatch & (imgGray > 0);
boxes = regionprops(~whiteLines, 'BoundingBox');

for k = 1:6
    subplot(3,2,k)
    boxHere = round(boxes(k).BoundingBox);
    imshow(img(boxHere(2):(boxHere(2)+boxHere(4)-1), boxHere(1):(boxHere(1)+boxHere(3)-1), :));
end

答案 1 :(得分:1)

您可以sum沿着与该输入图像对应的二进制图像的列,并从sum值中找到峰值。这正是在这里的代码中实现的 -

img = imread('http://puu.sh/cU3Nj/b020b60f0b.png');
BW = im2bw(img,0.1); %// convert to a binary image with a low threshold

peak_sum_max = 30; %// max of sum of cols to act as threshold to decide as peak
peaks_min_width = 10; %// min distance between peaks i.e. min width of each part 

idx = find( sum(BW,1)>=peak_sum_max );
split_idx = [1 idx( [true diff(idx)>peaks_min_width ] )];
split_imgs = arrayfun(@(x) img(:,split_idx(x):split_idx(x+1)),...
                                             1:numel(split_idx)-1,'Uni',0);

%// Display split images
for iter = 1:numel(split_imgs)
    figure,imshow(split_imgs{iter})
end

请注意,最终输出split_imgs是一个单元格数组,每个单元格都包含每个分割图像的图像数据。


如果您希望直接分割图像而不需要弄乱单元格数组,那么在split_idx之后,您可以执行此操作 -

%// Get and display split images
for iter = 1:numel(split_idx)-1
    split_img = img(:,split_idx(iter):split_idx(iter+1));
    figure,imshow(split_img)
end

答案 2 :(得分:0)

计算机视觉系统工具箱中现在有一个内置的ocr功能。