Image Matlab:条形码扫描器

Image Matlab:条形码扫描器,image,matlab,image-processing,barcode,windowing,Image,Matlab,Image Processing,Barcode,Windowing,我想用matlab做一个条形码扫描器。在条形码中,每个白色条为1,每个黑色条为0。我在试着弄这些酒吧。但问题在于: 正如你所看到的,这些条的宽度在3像素时是不同的。。。然后是2像素等等。。。更糟糕的是,它们的图像也不同。所以我的问题是。如何在不知道1条宽度的情况下获得这些条的值。或者我如何给它们相同的宽度。(两个相同的条可以相邻)。无法检测条之间的过渡,因为在一定数量的像素之后可能会发生过渡。。。然后可以有另一个酒吧或同一个酒吧。但是因为不可能知道这一定数量的像素,所以不可能检测到过渡。也不可

我想用matlab做一个条形码扫描器。在条形码中,每个白色条为1,每个黑色条为0。我在试着弄这些酒吧。但问题在于:

正如你所看到的,这些条的宽度在3像素时是不同的。。。然后是2像素等等。。。更糟糕的是,它们的图像也不同。所以我的问题是。如何在不知道1条宽度的情况下获得这些条的值。或者我如何给它们相同的宽度。(两个相同的条可以相邻)。无法检测条之间的过渡,因为在一定数量的像素之后可能会发生过渡。。。然后可以有另一个酒吧或同一个酒吧。但是因为不可能知道这一定数量的像素,所以不可能检测到过渡。也不可能使用某种类型的窗口,因为这些栏没有标准宽度。那么,我如何将其正常化呢

条形码:


提前谢谢

让我们假设这些条是严格垂直的(如您的示例所示)。以下是一个可能的工作流程:

%# read the file
filename = 'CW4li.jpg';
x = imread(filename);
%# convert to grayscale
x = rgb2gray(x);

%# get only the bars area
xend = find(diff(sum(x,2)),1);
x(xend:end,:) = [];

%# sum intensities along the bars
xsum = sum(x);

%# threshold the image by half of all pixels intensities
th = ( max(xsum)-min(xsum) ) / 2;
xth = xsum > th;

%# find widths
xstart = find(diff(xth)>0);
xstop = find(diff(xth)<0);
if xstart(1) > xstop(1)
    xstart = [1 xstart];
end
if xstart(end) > xstop(end)
    xstop = [xstop numel(xth)];
end

xwidth = xstop-xstart;

%# look at the histogram
hist(xwidth,1:12)

%# it's clear that single bar has 2 pixels (can be automated), so
barwidth = xwidth / 2;
我相信这是一个很好的假设,宽度1上总是会有一个酒吧

如果无法获得整数值(例如,由于噪声),请尝试将数字四舍五入到最接近的整数并获得残差。您可以汇总这些残差以获得识别的质量评估


一些聚类算法(如k-均值聚类)也可以很好地工作。

你能发布完整的图像吗?或者一个有更多条的部分?如果你的条有两个像素宽,你的分辨率太低,无法进行任何有意义的处理。也许你可以计算平均强度
M
,然后对每个像素
p
测试其强度是否为
I(p)>1.1*M
I(p)我目前用平均值固定它,它会给出一个不错的结果。但我怀疑它是否总能给出正确的结果。我得到了一些类似的结果,但有些图像无法看到宽度是否为条形图的2像素,而且这些变化太大了。我认为用平均值代替你最后一行中的2是解决办法。(我的解决方案如何工作)
barwidth = xwidth ./ min(xwidth);