Как нарисовать прямую через точки центроида штрих-кода, используя точки наилучшего соответствия Matlab - PullRequest
2 голосов
/ 18 января 2012

Это обработанное изображение, и я не могу увеличить bwareaopen (), так как он не будет работать для моего другого изображения.

В любом случае я пытаюсь найти самые короткие точки в центральных точках штрих-кода, чтобы получить прямую линию поперек центральных точек в штрих-коде.

Пример: После выполнения команды центроида точки в штрих-коде находятся рядом друг с другом. Поэтому я просто хотел получить самые короткие точки (это штрих-код) и нарисовать прямую линию поперек.

Не нужно объединять все точки, лучше всего подойдут точки.

Шаг 1

занятой кот http://i42.tinypic.com/29ekeap.jpg

Шаг 2

занятой кот http://i44.tinypic.com/16apts5.jpg

Шаг 3

занятой кот http://i43.tinypic.com/1fztjm.jpg

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Если у вас нет элементов x, y, которые использует Андрей, вы можете найти их, сегментируя изображение и используя наивное пороговое значение в области, чтобы избежать включения числа под штрих-кодом.

I 'Мы взломали решение в MATLAB, выполнив следующее:

  1. Загрузка изображения и создание его двоичного файла
  2. Извлечение всех подключенных компонентов с помощью bwlabel ().
  3. Получение полезной информации о каждом из них с помощью regionprops () [.centroid будет хорошим приближением к средней точке линий].
  4. Выделены пороги небольших областей (шум и числа)
  5. Извлеченные координаты x, y
  6. Использовано решение линейной аппроксимации Андрея

Код:

set(0,'DefaultFigureWindowStyle','docked');
close all;clear all;clc;
Im = imread('29ekeap.jpg');
Im=rgb2gray(Im);
%%

%Make binary
temp = zeros(size(Im));
temp(Im > mean(Im(:)))=1;
Im = temp;

%Visualize
f1 = figure(1);
imagesc(Im);colormap(gray);

%Find connected components
LabelIm = bwlabel(Im);

RegionInfo = regionprops(LabelIm);

%Remove background region
RegionInfo(1) = [];

%Get average area of regions
AvgArea = mean([RegionInfo(1:end).Area]);

%Vector to keep track of likely "bar elements"
Bar = zeros(length(RegionInfo),1);

%Iterate over regions, plot centroids if area is big enough
for i=1:length(RegionInfo)
   if RegionInfo(i).Area > AvgArea 
       hold on;
       plot(RegionInfo(i).Centroid(1),RegionInfo(i).Centroid(2),'r*')
       Bar(i) = 1;
   end
end

%Extract x,y points for interpolation
X = [RegionInfo(Bar==1).Centroid];
X = reshape(X,2,length(X)/2);

x = X(1,:);
y = X(2,:);

%Plot line according to Andrey
p = polyfit(x,y,1);
xMin = min(x(:));
xMax = max(x(:));
xRange = xMin:0.01:xMax;
yRange = p(1).*xRange + p(2);
plot(xRange,yRange,'LineWidth',2,'Color',[0.9 0.2 0.2]);

В результате получилась довольно хорошо подобранная линия.Вы должны быть в состоянии расширить его до конца, используя полином «p» и оценивать, когда вы больше не встретите «1», если это необходимо.

Результат:

enter image description here

2 голосов
/ 18 января 2012

Если вы уже нашли x, y центров, вам следует использовать функцию polyfit : вы найдете полиномиальные коэффициенты наилучшей линии.Для того, чтобы нарисовать сегмент, вы можете взять минимальное и максимальное x

p = polyfit(x,y,1);
xMin = min(x(:));
xMax = max(x(:));
xRange = xMin:0.01:xMax;
yRange = p(1).*xRange + p(2);
plot(xRange,yRange);
1 голос
/ 19 января 2012

Если ваша конечная цель состоит в том, чтобы сгенерировать линию, перпендикулярную столбцам в штрих-коде и проходящую примерно через центроиды столбцов, то у меня есть еще один вариант для вас рассмотреть ...

Простым решением было бы выполнить преобразование Хафа, чтобы определить первичную ориентацию линий в штрих-коде. Как только вы найдете угол линий в штрих-коде, все, что вам нужно сделать, это повернуть его на 90 градусов, чтобы получить наклон перпендикулярной линии. Центроид полного штрих-кода может затем использоваться в качестве перехвата для этой линии. Используя функции HOUGH и HOUGHPEAKS из Инструментов обработки изображений , вот код, начинающийся с обрезанной версии вашего изображения с шага 1:

img = imread('bar_code.jpg');  %# Load the image
img = im2bw(img);              %# Convert from RGB to BW

[H, theta, rho] = hough(img);  %# Perform the Hough transform
peak = houghpeaks(H);          %# Find the peak pt in the Hough transform
barAngle = theta(peak(2));     %# Find the angle of the bars
slope = -tan(pi*(barAngle + 90)/180);  %# Compute the perpendicular line slope

[y, x] = find(img);  %# Find the coordinates of all the white image points
xMean = mean(x);     %# Find the x centroid of the bar code
yMean = mean(y);     %# Find the y centroid of the bar code

xLine = 1:size(img,2);                   %# X points of perpendicular line
yLine = slope.*(xLine - xMean) + yMean;  %# Y points of perpendicular line

imshow(img);               %# Plot bar code image
hold on;                   %# Add to the plot
plot(xMean, yMean, 'r*');  %# Plot the bar code centroid
plot(xLine, yLine, 'r');   %# Plot the perpendicular line

А вот и полученное изображение:

enter image description here

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