Надежное отслеживание blobs

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

входные данные:

желаемый результат:

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

Что делает это трудно шум и возможные перекрытия.

пример с Уровень шума:

пример с перекрытием и шумом:

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

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

возможной метрикой, которая оценивает потенциальную подгонку, является:

сумма по всем эллипсам (K1 * процентное отклонение от ожидаемого размера + K2 * процент отклонения от ожидаемого соотношения сторон + K3 * процент эллипса, который не является черным + K4 * процент перекрытия с любым другим эллипсом) + K5 * процент остального изображения, которое является черным

для некоторых подходяще выбранных параметров K1..К5. Идеальный матч забивает 0.

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

Я бы предпочел примеры в python и / или opencv. Я постараюсь реализовать и опубликовать любые предлагаемые решения в python. Спасибо!

P. S. Это не может быть предполагается, что объект подключен. Причин может быть достаточно шума, чтобы разбить его на дискретные части.

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

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

P. P. P. P. S. По запросу, вот пример со сквозным разрезом из-за шума:

и образец с большим количеством шума, но тем не менее отчетливый blob:

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

5 ответов


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


вы заполняете отверстия [1], вы обнаруживаете контуры [2], и используйте моменты на каждом прямоугольнике контура, чтобы найти ориентацию, эксцентриситет и т. д.[3].

PS.: Отключенные контуры (шум) могут быть отфильтрованы по размеру.


вы можете начать с фильтрации контуры по району.

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

в формате OpenCV это fittEllipse также будет полезно.


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


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

посмотреть учебник здесь.