Альтернативный алгоритм обнаружения больших двоичных объектов

#image #algorithm #matlab #image-processing #detection

#изображение #алгоритм #matlab #обработка изображений #обнаружение

Вопрос:

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

введите описание изображения здесь

Моя цель — запрограммировать FPGA с использованием пакета обработки изображений «Sapera APF». Sapera APF — это приложение для программирования устройств захвата кадров Teledyne DALSA для выполнения обработки изображений. И, к сожалению, он не позволяет нам писать код обычным способом, Не позволяет использовать базовые функции кодирования (операторы if else, циклы и т. Д.), А Поддерживает только некоторые встроенные функции в виде блоков кода, и мы можем только упорядочивать эти блоки. К вашему сведению, вот ссылка на список функций, поддерживаемых Sapera.

Теперь моей первой целью было протестировать мой алгоритм на matlab, а затем реализовать его на Sapera. Вот мой подход в matlab:

  1. Примененный фильтр средних значений (для шага 3)
  2. Пороговое изображение с использованием адаптивного порогового значения (возвращает двоичное изображение)
  3. Удаленные строки при проверке связности все строки соединены с разрешением более 100 пикселей (для лучшей связности сначала был применен фильтр среднего значения)
  4. Теперь, поскольку остались только большие двоичные объекты, их местоположение было идентифицировано (с grayvalue=255 ), и соответствующие пиксели были взяты из исходного изображения.

Это простой алгоритм, который отлично работает в matlab. Но реальная проблема заключается в том, что для шага 3 (т. Е. Подключения), конечно, мне пришлось писать циклы, идущие к каждому пикселю, проверяя наличие подключения, что невозможно сделать в Sapera. Итак, я ищу какой-нибудь другой более простой алгоритм для разделения больших двоичных объектов на моих изображениях, без использования циклов и условного оператора, чтобы его можно было реализовать в Sapera, но теперь мне просто нужен его код или алгоритм matlab.

Ответ №1:

Как представляется, все операции Sapera относятся к семейству операций «точка-точка» или «соседство» (= обработка изображений), и мало что может помочь вам сегментировать большие двоичные объекты. (Действительно, нет функции, которая возвращала бы «небольшое количество чего-то»; все они возвращают полные изображения или скалярные значения.)

В качестве обходного пути вы можете

  • ограничьте обработку интересующей областью (вертикальная полоса обязательно должна содержать большие двоичные объекты, но вы можете игнорировать стороны);

  • используйте функцию horizontalSum, чтобы получить профиль изображения, в котором вы можете найти пики, соответствующие большим двоичным объектам (вам придется программировать его самостоятельно, но объем данных значительно сокращается);

  • аналогично, используйте verticalSum для нахождения горизонтальных границ.

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

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

введите описание изображения здесь

И горизонтальный профиль действительно бесшовный.

введите описание изображения здесь

Ответ №2:

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

  • Сглаживание данных изображения (свертка с гауссовым ядром)
  • Поиск локальных максимумов (больше, чем circshift во всех направлениях) выше порогового значения, данные должны быть сглажены настолько, чтобы на объект приходилось не более одного локального максимума
  • Вычислите локальную эллиптичность для каждого максимума (см. Ниже)
  • Принимайте только локальные максимумы с низкой эллиптичностью

Как вычислить локальную эллиптичность:

  • Вычисление вторых центральных моментов данных (вычитание фона), т.Е. Взвешенное суммирование данных вокруг каждого пика с x^2 y^2 помощью или xy , где x и y — координаты с началом координат в положении пика.
  • Диагонализируйте матрицу, состоящую из [moment_xx, moment_xy; moment_xy, moment_yy], чтобы получить меры для длин большой и короткой осей локальной эллиптической формы.
  • Определите эллиптичность как отношение большей оси к меньшей.

В частном случае наличия только горизонтальных или вертикальных, но никогда диагональных линий вы также просто вычисляете x^2 и y^2 взвешенные моменты и принимаете только те, которые достаточно равны.