Если у вас нет элементов x, y, которые использует Андрей, вы можете найти их, сегментируя изображение и используя наивное пороговое значение в области, чтобы избежать включения числа под штрих-кодом.
I 'Мы взломали решение в MATLAB, выполнив следующее:
- Загрузка изображения и создание его двоичного файла
- Извлечение всех подключенных компонентов с помощью bwlabel ().
- Получение полезной информации о каждом из них с помощью regionprops () [.centroid будет хорошим приближением к средней точке линий].
- Выделены пороги небольших областей (шум и числа)
- Извлеченные координаты x, y
- Использовано решение линейной аппроксимации Андрея
Код:
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](https://i.stack.imgur.com/o51WM.png)