влияние ligting на сегментацию изображения в matllab

Я пытаюсь выполнить задачу сегментации на картинке ниже.

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

Я использую нечеткие c-средства с минимальной предварительной обработкой. Сегментация будет иметь 3 класса: фон (синяя область), мясо (красная область) и жир (белая область). Сегментация фона работает отлично. Однако сегментация мяса и жира в левой части фотографии отображает многие мясные ткани как жир. финальная мясная маска выглядит так:

маска

Я подозреваю, что это из-за условий освещения, которые делают левую сторону ярче, поэтому алгоритм классифицирует эту область как жирную. Также я думаю, что могли бы быть некоторые улучшения, если бы я мог как-то сделать поверхность более гладкой. Я использовал медианный фильтр 6x6, который работает нормально, но я открыт для новых предложений. Любые предложения, как преодолеть эту проблему? Может какое-то сглаживание? Спасибо :)

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


person Saam    schedule 07.06.2015    source источник
comment
Не могли бы вы показать нам, как будет выглядеть идеальная сегментация? Мне трудно понять, что является жиром, а что мясом из этого образца... и если мне (т.е. человеку) трудно понять это, то алгоритму, вероятно, еще сложнее определить одни и те же регионы. Есть очевидные области, такие как нижняя половина произведения и середина, но есть и такие, которые немного неоднозначны. Кроме того, некоторый код, иллюстрирующий, как вы получили вышеуказанный результат, был бы полезен. Это может быть просто небольшое изменение параметра (или двух) вашего текущего алгоритма.   -  person rayryeng    schedule 08.06.2015


Ответы (2)


Первое правило сегментации: «Постарайтесь описать, как вы (как человек) смогли провести сегментацию». Как только вы это сделаете, алгоритм станет ясен. Другими словами, вы должны выполнить следующие 2 задачи:

  1. Определите уникальные особенности каждой сегментированной части (в вашем случае - чем отличается сало от мяса).
  2. Выберите наиболее подходящий вам классификатор (C-средние, нейронная сеть, SVM, дерево решений, усиленный классификатор и т. д.). Этот классификатор будет работать с функциями, выбранными на шаге 1.

Кажется, вы пропустили шаг 1, и это проблема вашего алгоритма.

Вот мои наблюдения:

  1. Яркость пикселя не делает различий между мясом и жиром. Это зависит в основном от освещения, угла наклона ткани и зеркального отражения. Итак, вы должны убрать яркость
  2. Кажется, что жир более "желтый". другими словами, соотношение красного цвета к зеленому цвету для мяса намного выше, чем для жира. Это та особенность, с которой я бы начал реализацию. Чтобы использовать эту функцию, преобразуйте изображение RGB в YUV или HSV. Если вы работаете с YUV, полностью откажитесь от Y и запустите свой классификатор на плоскости V. В HSV запустите его на плоскости H. Таким образом, вы отбросите яркость и будете иметь дело только с цветами (в основном с красной и зеленой составляющей). Я рекомендую также использовать эти цветовые пространства для разделения фона.
  3. Следующий шаг - вы должны добавить больше признаков в свой классификатор, так как цвета будет недостаточно. Другое наблюдение заключается в том, что мясо является гораздо более гибкой тканью, поэтому на нем будет больше складок, а жир имеет тенденцию быть более гладким. Вы можете искать ребра и вставлять абсолютное количество ребер в качестве еще одной функции в свой классификатор.
  4. Продолжайте наблюдать за своими результатами, определите, где классификатор допустил ошибки, и попытайтесь придумать другие новые функции, чтобы лучше разделить две текстуры. Пример функций, которые могут быть очень хорошими в вашем случае: HOG, LBP на пирамиде изображений, функции MCT, три патча lbp, (x,y)-проекции. Моя интуиция подсказывает, что больше всего вам поможет 3-patch-lbp, но мне очень сложно объяснить, почему.
  5. Личное предложение: я не знаю, какие функции реализованы в Matlab. Но вы должны начать с уже существующих функций, чтобы сэкономить время на написание большого количества нового кода. Например, я знаю, что функции HAAR уже реализованы в Matlab, но сами по себе они могут быть недостаточно описательными для вашего случая. Объедините несколько типов функций, чтобы получить наилучший результат, и избегайте использования перекрывающихся функций (две разные функции, которые захватывают почти одинаковую информацию на изображении). Например, если вы используете MCT, не используйте LBP.

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

person DanielHsH    schedule 08.06.2015
comment
спасибо DanielHsH, очень проницательный ответ. Я попробую ваши предложения. Между тем, есть ли у вас какие-либо идеи по уменьшению отражения/бликов? Как думаете, стоит попробовать убрать блики? Еще раз спасибо :-) - person Saam; 09.06.2015
comment
Не уверен. На примере изображения блики кажутся очень локальными (охватывающими небольшие области). Так что когда ваш классификатор будет сильным - они не должны на него влиять. Вы можете попытаться удалить их, установив порог очень ярких пикселей или медианную фильтрацию, но я не уверен, что это поможет в долгосрочной перспективе. В настоящее время ваш классификатор очень слаб, поэтому на него легко воздействуют блики. Вы должны сосредоточить свои усилия на повышении эффективности классификатора (путем добавления функций с хорошими способностями к разделению). Решение мелких проблем, таких как блики, может отвлекать. P.S. - Я обновил свой ответ, чтобы помочь вам больше - person DanielHsH; 09.06.2015
comment
Спасибо @DanielHsH, добавленный раздел сделал его намного понятнее. Я собираюсь попробовать различные функции, чтобы увидеть, как они работают с этой конкретной проблемой. Я использую схему обучения без присмотра, в которой каждая фотография передается в классификатор для маркировки пикселей (или областей) как фона, мяса или жира (я пробовал k-средние и нечеткие c-средние). Поэтому, когда вы говорите об обучении классификаторов, я предполагаю, что вы говорите об извлечении набора функций для каждого пикселя/области и передаче его алгоритму кластеризации для назначения каждого пикселя/области соответствующему кластеру. Это правильно? - person Saam; 10.06.2015
comment
Точно. В каждой области NxN пикселей вы извлекаете некоторые функции и объединяете их в вектор [feature1, feature2, .... featureK]. Теперь вы передаете этот вектор классификатору. Мне не нравится термин «алгоритм кластеризации», потому что он обычно предполагает жесткую кластеризацию (мясо или жир). Классификатор (например, нейронная сеть, SVM и т. д.) обеспечивает мягкую кластеризацию. Результатом классификатора может быть (87% мяса, 13% жира) или (50%-50% в случае, если классификатор не может решить). Мягкая кластеризация намного лучше, так как вы можете увидеть гладкую тепловую карту, где появляются области мяса и жира, и применить более сильную постобработку. - person DanielHsH; 10.06.2015

Если у вас нет выходных меток, вам необходимо применить алгоритм обучения без учителя для классификации. Для многих изображений человеческий глаз не является идеальным инструментом для классификации. Вот почему тогда мы используем компьютеры :D Так как они могут показать нам распределение интенсивности и предоставить различные классы. Одной из альтернатив является использование связанных компонентов для идентификации и разделения классов жир-мясо и BG, поскольку они имеют совершенно разные интенсивности, за исключением границ между средним значением и жиром.

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

набор параметров 1

набор параметров 2

person fati    schedule 25.10.2018