Давайте предположим, что столбцы строго вертикальны (как в вашем примере).Вот возможный рабочий процесс:
%# 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-среднему значению) также могут работать хорошо.