Привет CV / Сообщество распознавания образов,
У меня есть серьезная проблема относительно сегментации изображения. Сценарий - это атмосфера в печи, которая заставляет мою голову сходить с ума. И мне нужно обнаружить контуры объектов из разных материалов (стекло, керамика, Al, Ir, ...) за короткий промежуток времени (<10 секунд), а не только для одного особого случая. Мне также нужен контур в последовательном ряду пикселей для кода. Поэтому также необходим код цепи или так называемое следование границе / контуру, поэтому открытые отверстия не годятся. На заднем плане - нелинейные шумы, примерно от пыли, частиц или чего-то еще, которые появляются время от времени.
Предложения Matlab или OpenCV приветствуются.
Чтобы сделать это более понятным, я разместил еще одно изображение своей цели и полупрозрачный объект, который также должен быть обнаружен. Также есть дополнительные примеры, о которых нужно знать.
Как вы можете видеть на изображении № 1, в правой части изображения и рядом с внешним контуром звезды, являющейся объектом, есть частицы. Также общий контраст не очень хороший. Сам объект стоит под землей, что не имеет отношения к обнаружению контура. На изображении № 2 показан полупрозрачный объект, что также возможно.
Я хочу найти контур / периметр этого объекта, как на следующем экране (красная линия). Два прямоугольника (желтый) обозначают начальную (слева) и конечную точку (справа). Синяя линия игнорируется.
Сначала я думал, что смогу решить проблему этой грязной атмосферы с помощью только фильтров. Но после того, как я потратил много времени, я только что понял, что мне нужно значительно улучшить или уменьшить шум, чтобы увеличить контраст переднего и заднего плана. Я пробовал много методов, таких как выравнивание по гистограмме, адаптивное выравнивание по Оцу, линейные фильтры (например, гаусс), нелинейные фильтры (медиана, диффузия), активные контуры, k-Means, Fuzzy-c-means, а также Canny для чистого Обнаружение края в сочетании с морфологическими операторами.
- Canny: Частицы и атмосфера вызывают дыры, но мне нужен полный контур объекта. Тем не менее, с закрытием, расширением морфологических операторов это недостаточно хорошо. У Кенни все еще лучшие результаты из всех методов, которые я изучал из-за гистерезиса.
- Активные контуры: они также работают с краями / градиентами, они действуют совершенно сумасшедшими после инициализации внутри объекта, что, возможно, вызвано картой краев, приводящей к «открытому» объекту. Насколько я знаю, контур должен быть замкнут. Пробовал с разными производными (GVF / VFC / Classic Snake).
- k-средства: результаты включают атмосферу печи, из-за туманного фона. То же самое для нечетких с-средств. Я выбрал два кластера из-за отделения объекта от фона. Чем больше кластеров, тем слабее результаты.
- Гистограмма / Оцу: Из-за очень близких оттенков серого (imho!), Он сливает объект с фоном. Пробовал с локальными и глобальными методами.
- Фильтры: особенно GLPF или другие LPF смазывают края, что не так хорошо и даже не уменьшает туманную атмосферу.
- Нелинейные фильтры сохраняют края. Большинство из них занимает слишком много времени для расчета больших изображений. Взял быстрый двусторонний фильтр на данный момент. Результаты см. Ниже.
Поэтому ни один метод не подходит для этапов постобработки, поскольку полученные результаты сегмента объекта плохо конкурируют с существующим алгоритмом. Этот существующий алгоритм очень локальный, и поэтому он работает для этого очень особого сценария.
Поэтому я спрашиваю вас, если я что-то упустил полностью ... У меня нет дальнейшей идеи, как обрабатывать и как я должен получить хорошие результаты контура, не имея пробелов или дыр. Возможно ли это без внесения большого количества изменений ПЗС и физическая среда? Заранее спасибо!
Последний подход на данный момент (после долгой ночи экспериментов с МО):
- Двусторонний фильтр (сохранение краев, но сглаживание однородных областей)
- Canny (Sigma = 2, Threshold = [0,04 0,08])
- Морфологические операции (МО):
bwareopen
,closing
,remove
&bridge
bwlabel
для выбора только периметра контура, который удаляет нежелательные шумы. обновленных скриншотов пока нет, но работает на звезду. стекло имеет внутренний контур, который связан с внешним контуром, что также можно увидеть на скриншоте ниже.
Поэтому я боюсь, что мне нужен специальный алгоритм обхода внешнего контура. Это будет поиск окрестности по часовой стрелке / против часовой стрелки. Этот шаг по часовой стрелке / против часовой стрелки может переключаться, если есть угловая точка. если есть разрыв, увеличьте радиус и посмотрите снова. если есть два или более возможных следующих пункта, возьмите тот, который получил то же направление, что и предыдущий. Как вы думаете, этот алгоритм следования контуру имеет смысл?
Ответы:
Вы можете попробовать следующее:
Эффективная сегментация изображения на основе графика: http://www.cs.brown.edu/~pff/segment/ (код доступен)
Сегментация на основе GraphCut: http://www.csd.uwo.ca/~olga/OldCode.html (код доступен)
Сначала удалите изображение с помощью разреженных методов: http://spams-devel.gforge.inria.fr/ (код доступен)
источник
Я думаю, что вы отказались от техники порогов слишком рано. Посмотрите на свою гистограмму, она явно тримодальна: (я удалил белые столбцы справа от вашего изображения вручную, я предполагаю, что они не являются частью изображения - пожалуйста, сделайте это изображение перед запуском моего кода)
Посмотрите на все значения в первой группе:
Чтобы найти моды в тримодальной гистограмме, можно использовать кластеризацию K-средних с
K=3
интенсивностью. Следующий код Matlab находитth1=67
в вашем коде. Идея состоит в том, чтобы предположить, что у вас есть 3 набора, и рассчитать взвешенный центроид для каждого. Затем каждый уровень интенсивности назначается своему кластеру. Вы останавливаетесь, когда взвешенные центроиды перестают двигаться. Вот результат нахождения двух порогов на вашем изображении, показанных на гистограмме.Решение проблемы - это просто пирог, просто сделайте несколько простых морфологических операций, таких как открытие.
источник
imhist
наhist
Как указывалось выше, пороговое значение может быть очень эффективным для этого изображения, которое по существу является двоичным, за исключением того, что постоянный порог не будет работать из-за неравномерного освещения. Вам нужен адаптивный порог.
Я бы посоветовал сделать фоновую реконструкцию с помощью простой модели (возможно, плоской [3 DOF] или квадратичной [6 DOF]), выбрав небольшое количество значений в светлых областях. Лучше всего использовать небольшие ROI для усреднения шума. Затем исправьте затенение путем вычитания (или деления на) фоновых значений.
Если взаимодействие с человеком недоступно, вы можете автоматизировать поиск фоновых областей, выполнив сначала прямую операцию Оцу и учитывая равномерную рентабельность инвестиций (низкую дисперсию), находящуюся значительно ниже порога. После первой реконструкции фона вы, вероятно, сможете улучшить, применив этот процесс к плоско-скорректированному изображению.
Весь процесс может быть реализован так, чтобы он работал намного меньше секунды.
источник
Я думаю, что лучше всего использовать активные контуры. Если вы не знаете, что такое активные контуры, посмотрите это видео на YouTube http://www.youtube.com/watch?v=ijNe7f3QVdA.
По сути, вам нужно дать инициализацию сегментации, и это улучшит форму. Я предлагаю один из методов, обсуждаемых в этом посте, и использовать активные контуры в качестве 2-го шага, т.е. как шаг улучшения.
Вот реализация активных контуров, которые вы можете использовать http://www.mathworks.com/matlabcentral/fileexchange/19567
источник
Вы четко знаете, о чем вы, но вы не упомянули об использовании порогового значения, в частности пытались ли вы применить глобальный порог, используя Otsu для вычисления правильного уровня, затем найти контуры и выбрать самый большой?
[Изменить, чтобы уточнить]
Глобальный порог, очевидно, не будет работать из-за видимого отклонения изображения.
Я быстро поиграл с этим и обнаружил, что если вы разбиваете изображение на 6 частей (2 строки по 3 столбца одинакового размера), затем выполняете установку порога с использованием Otsu для каждого из них, а затем собираете заново, это делает довольно хорошую работу по очистке образ.
В верхней правой части звезды все еще есть небольшие артефакты.
Мне приходит в голову, что, поскольку объект имеет границы прямых линий, вы можете рассмотреть преобразование Хафа, чтобы извлечь эти ребра, пересечь их, чтобы найти вершины и использовать результат в качестве контура вашего объекта.
источник
Контуры всегда прямые или известные кривые?
Если это так, то вместо того, чтобы пытаться получить каждый пиксель по краю правильно, я бы использовал преобразования Хафа, чтобы получить уравнения линий, а затем воссоздать счетчики по линиям и их сечениям.
источник