Объяснение простой техники сегментации штрих-кода из изображений

В этой статье я собираюсь объяснить простой метод сегментации штрих-кода из изображений.

В качестве примера кода я использую Python 2.7 в его воплощении Anaconda и OpenCV в качестве библиотеки обработки изображений.

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

Anaconda - интересный дистрибутив Python, который объединяет ряд полезных инструментов для научного программирования.

Сегментация - это процесс определения положения одного или нескольких объектов внутри изображения.

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

Используемая функция штрих-кода - это близкое расстояние между полосами штрих-кода.

Начиная

После установки Anaconda перейдем к установке OpenCv с помощью следующей команды из командной строки Anaconda:

conda install -c https://conda.anaconda.org/menpo opencv

А теперь давайте запустим Spyder IDE из лаунчера Anaconda.

После запуска Spyder я предлагаю вам убедиться, что установка OpenCV прошла успешно.

В правом нижнем углу консоли Python давайте протестируем:

import cv2

Код и техника

Я создал репозиторий GitHub для стартапа.

Вы можете клонировать его с помощью:

git clone --branch step1 https://github.com/lucapiccinelli/BarcodesTutorial.git

При этом вы загрузите тестовое изображение и начальный код, который читает и показывает изображение.

С этого момента начнется настоящая обработка.

Сначала мы собираемся преобразовать изображение в двоичную форму, возможно, улучшив наиболее интересные функции. С помощью оператора черной шляпы мы можем улучшить самые темные элементы изображения.

Теперь мы можем безопасно преобразовать изображение в двоичную форму с помощью простого глобального порога. Оператор черной шляпы позволяет нам использовать очень низкое пороговое значение, не уделяя слишком много внимания шуму.

При применении blackhat мы используем ядро, которое придает большее значение вертикальным элементам изображения.

Ядро имеет фиксированный размер, поэтому изображение масштабируется, что также способствует повышению производительности (и способствует некоторой нормализации ввода).

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

Эта комбинация расширения и закрытия очень хорошо работает с тестовым изображением, однако возможно, что она не дает такого же эффекта на других изображениях.

Это не проблема, вы можете попробовать изменять параметры и комбинацию операторов, пока не будете удовлетворены результатами.

Последним шагом предварительной обработки является применение оператора открытия с очень большим ядром для удаления элементов, которые слишком малы, чтобы соответствовать форме штрих-кода.

И вот ваш окончательный результат:

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

Как вы можете видеть на предыдущем изображении, некоторый шум не был отфильтрован на последнем морфологическом шаге. Однако в этом случае их довольно просто отфильтровать, установив порог по значению площади прямоугольника.

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

Заключение

Представленная методика очень проста и эффективна, но имеет некоторые досадные недостатки:

  • Он очень чувствителен к перекосу штрих-кода; он работает хорошо примерно до 45 градусов, затем вам нужно выполнить второй проход, изменив направление ядра.
  • Он может находить штрих-коды только в фиксированном диапазоне размеров.
  • Несмотря на фильтрацию, наложенную на прямоугольные области, возможно, что некоторые элементы, не относящиеся к штрих-кодам, не будут удалены.

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

Хорошее решение - проинструктировать искусственную нейронную сеть (или какой-либо другой классификатор, который вам нравится) по функциям штрих-кода (градиент изображения, преобразование Фурье) и отфильтровать шум за секунду.

Возможно, следующая статья будет по этой теме.

использованная литература

Вот полный пример кода.

Вот и репозиторий GitHub. В каталог img я поместил все изображения промежуточных шагов.

Это все, ребята. Надеюсь, мне удалось объяснить эту технику; если нет, дайте мне знать.

Спасибо за чтение!