【问题标题】:Matlab: Barcode scannerMatlab:条码扫描仪
【发布时间】:2012-01-03 01:02:24
【问题描述】:

我正在尝试在 matlab 中制作条形码扫描仪。在条形码中,每个白条都是 1,每个黑条都是 0。我正在尝试获取这些条。但这就是问题所在:

正如您所见,条形的宽度不一样,有一次它们是 3 像素……然后是 2 像素等等……更糟糕的是,它们的图像也不同。所以我的问题是。在不知道 1 条宽度的情况下如何获取这些条的值。或者我如何给它们所有相同的宽度。 (2个相同的酒吧可以彼此相邻)。无法检测条形之间的过渡,因为在一定数量的像素之后可能会出现过渡......然后可能会有另一个条形或同一个条形。但是因为不可能知道这个特定数量的像素,所以不可能检测到过渡。由于条形没有标准宽度,因此也无法使用某种窗口。那么我该如何规范呢?

条形码:

提前谢谢!

【问题讨论】:

  • 你能发一张完整的图片吗?还是有更多条的部分?
  • 如果您的条形图有两个像素宽,那么您的分辨率太低,无法进行任何有意义的处理。
  • 也许您可以计算平均强度M,然后对每个像素p 测试其强度是I(p)>1.1*M 还是I(p)<0.9*M
  • 我目前用平均值修复了它,它给出了一个不错的结果。但我怀疑它总是会给出正确的结果。

标签: image matlab image-processing barcode windowing


【解决方案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;

更新

要获得相对条形宽度,我们可以将宽度(以像素为单位)划分为最小条形宽度:

barwidth = xwidth ./ min(xwidth);

我相信在宽度 1 上总会有一个条形是很好的假设。

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

一些聚类算法(如 k-mean 聚类)也可能很好用。

【讨论】:

  • 我有类似的东西,但是有些图像无法看到宽度是否为条形的 2 像素,而且这些变化太大。我认为用平均值替换最后一行中的 2 将是解决方案。 (我的解决方案如何工作)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
相关资源
最近更新 更多