Matlab: сканер штрих-кода - PullRequest
1 голос
/ 21 ноября 2011

Я пытаюсь сделать сканер штрих-кода в Matlab.В штрих-коде каждая белая полоса равна 1, а каждая черная полоса равна 0. Я пытаюсь получить эти полосы.Но это проблема:

enter image description here

, поскольку вы можете видеть, что полосы не имеют одинаковую ширину, один раз они составляют 3 пикселя ... затем 2 пикселя и т. Д.еще хуже, они также различаются по изображениям.Итак, мой вопрос.Как я могу получить значения этих баров, не зная ширину 1 бара.Или как мне дать им одинаковую ширину.(2 одинаковых бара могут быть рядом друг с другом).Невозможно обнаружить переход между полосами, потому что переход возможен после определенного количества пикселей ... и тогда может быть другая полоса или такая же полоса.Но так как невозможно узнать это определенное количество пикселей, невозможно определить переход.Также невозможно работать с каким-либо окном, потому что полосы не имеют стандартной ширины.Так как я могу это нормализовать?

Штрих-код: enter image description here

Спасибо заранее!

1 Ответ

2 голосов
/ 22 ноября 2011

Давайте предположим, что столбцы строго вертикальны (как в вашем примере).Вот возможный рабочий процесс:

%# 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-среднему значению) также могут работать хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...