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

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

оригинальное изображение

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

маскировать

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

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

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) -проекции. Моя интуиция шепчет, что три-патч-фунт поможет вам больше всего, но мне очень трудно объяснить, почему.
  5. Личное предложение: я не знаю, какие функции реализованы в Matlab. Но вы должны начать с функций, которые уже существуют, чтобы сэкономить время при написании большого количества нового кода. Например, я знаю, что функции HAAR уже реализованы в Matlab, но они могут быть недостаточно описательными для вашего случая. Комбинируйте несколько типов функций, чтобы получить наилучший результат и избегайте использования перекрывающихся функций (две разные функции, которые фиксируют практически идентичную информацию на изображении). Например - Если вы используете MCT, не используйте LBP.

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

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

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

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

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

Другие вопросы по тегам