Сегментация изображения на основе карты крайних пикселей

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

После предсказания я получаю следующее изображение:

Изображение прогноза

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

Вот правильные очертания, кстати, для справки.

Правильные контуры

И исходное изображение:

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

И непрерывное отображение вероятности:

Карта непрерывной вероятности

3 Solutions collect form web for “Сегментация изображения на основе карты крайних пикселей”

Очень хорошая работа по обнаружению границ. Раньше я работал над подобными проблемами сегментации.

Теория:

Как только вы получили свою карту ребер, где e(i,j) указывает степень «края» в пикселе i,j вы хотели бы сегментировать изображение, которое будет уважать карту края, насколько это возможно.
Чтобы сформулировать это «уважение к реберной карте» более формальным образом, я предлагаю вам взглянуть на функционал корреляционной кластеризации (CC) :
Функциональность CC оценивает качество сегментации на основе парных отношений между соседними пикселями, должны ли они находиться в одном кластере (без края между ними) или в разных кластерах (между ними есть грань).
Взгляните на пример в разделе 7.1 вышеупомянутого документа.
CC используется для аналогичных проблем сегментации в медицинской (нейронной) картине, см., Например, здесь .


практика

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

Вот мое предложение:

  1. Края на карте края выглядят довольно толстыми и плохо расположены. Я предлагаю не-макс-подавление или морфологическое измельчение в качестве стадии предварительной обработки.

  2. После того, как у вас есть лучшие локализованные ребра, вы игнорируете «крайние» пиксели и работаете только с «не-крайними» пикселями, и назовите их «активными».
    Два активных пикселя, которые находятся рядом друг с другом: между ними нет «краевого» пикселя – они должны быть вместе. Таким образом, матрица смежности для неограниченных nieghbors должна иметь положительный характер.
    Рассмотрим три пикселя на линии, причем две конечные точки являются «активными» пикселями: если средний – это край, то два активных пикселя не должны принадлежать одному и тому же кластеру – соответствующие записи в матрице смежности должны быть отрицательными. Если средний пиксель также активен, а соответствующие записи в матрице смежности должны быть положительными.

  3. Рассмотрим все возможные соседние пары и триплеты (индуцирующие 24-связный сетчатый граф), позволяющий построить матрицу аффинности с положительными и отрицательными элементами, подходящими для CC.

  4. Учитывая матрицу, вы должны искать сегментирование с лучшим счетом СС (этап оптимизации). Для этого здесь есть код Matlab. Вы также можете использовать отличный пакет openGM .

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

Увидев изображение пикселя edge / non edge в классификаторе, мы видим, что изображение градиента вашего входа уже в основном дает результат узнаваемого классификатора. Но карта доверия показывает хорошее решение, за исключением того, что: 1. они связаны с наборами уровней с различными размерами. 2. у вас есть шумные яркие пятна в ячейках, которые вызывают ложные выходы из классификатора. (возможно, может быть рассмотрено некоторое сглаживание). Наверное, было бы легче описать внутреннее состояние каждой ячейки: оттенки серого, средний размер. Изучение этих распределений, вероятно, даст вам лучшие результаты обнаружения. Топологически у нас есть набор значений низких оттенков серого, вложенных в большие значения оттенков серого. Для этого можно использовать Graphcuts с моделью GMM для унитарных затрат и вычисленное градиентное распределение для парного члена

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

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

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

Python - лучший язык программирования в мире.