Подтвердить что ты не робот

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

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

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

Prediction image

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

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

Correct outlines

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

enter image description here

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

Continuous probability map

4b9b3361

Ответ 1

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

Теория:

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


Практика

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

Здесь мое предложение:

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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