Проблема сегментации изображения различных материалов


15

Привет CV / Сообщество распознавания образов,

У меня есть серьезная проблема относительно сегментации изображения. Сценарий - это атмосфера в печи, которая заставляет мою голову сходить с ума. И мне нужно обнаружить контуры объектов из разных материалов (стекло, керамика, Al, Ir, ...) за короткий промежуток времени (<10 секунд), а не только для одного особого случая. Мне также нужен контур в последовательном ряду пикселей для кода. Поэтому также необходим код цепи или так называемое следование границе / контуру, поэтому открытые отверстия не годятся. На заднем плане - нелинейные шумы, примерно от пыли, частиц или чего-то еще, которые появляются время от времени.

Предложения Matlab или OpenCV приветствуются.

Чтобы сделать это более понятным, я разместил еще одно изображение своей цели и полупрозрачный объект, который также должен быть обнаружен. Также есть дополнительные примеры, о которых нужно знать. example1 example2 example3 Example4

Как вы можете видеть на изображении № 1, в правой части изображения и рядом с внешним контуром звезды, являющейся объектом, есть частицы. Также общий контраст не очень хороший. Сам объект стоит под землей, что не имеет отношения к обнаружению контура. На изображении № 2 показан полупрозрачный объект, что также возможно.

Я хочу найти контур / периметр этого объекта, как на следующем экране (красная линия). Два прямоугольника (желтый) обозначают начальную (слева) и конечную точку (справа). Синяя линия игнорируется. example2

Сначала я думал, что смогу решить проблему этой грязной атмосферы с помощью только фильтров. Но после того, как я потратил много времени, я только что понял, что мне нужно значительно улучшить или уменьшить шум, чтобы увеличить контраст переднего и заднего плана. Я пробовал много методов, таких как выравнивание по гистограмме, адаптивное выравнивание по Оцу, линейные фильтры (например, гаусс), нелинейные фильтры (медиана, диффузия), активные контуры, 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для выбора только периметра контура, который удаляет нежелательные шумы. обновленных скриншотов пока нет, но работает на звезду. стекло имеет внутренний контур, который связан с внешним контуром, что также можно увидеть на скриншоте ниже.

Поэтому я боюсь, что мне нужен специальный алгоритм обхода внешнего контура. Это будет поиск окрестности по часовой стрелке / против часовой стрелки. Этот шаг по часовой стрелке / против часовой стрелки может переключаться, если есть угловая точка. если есть разрыв, увеличьте радиус и посмотрите снова. если есть два или более возможных следующих пункта, возьмите тот, который получил то же направление, что и предыдущий. Как вы думаете, этот алгоритм следования контуру имеет смысл?

Края стекла звезда


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

Привет, Руи, я попробовал адаптивный порог с этим расширением Matlab: Адаптивный порог Вот результаты для игры с параметрами окна: 1-я попытка 2-я попытка 3-я попытка Как вы можете видеть, при увеличении параметров средняя часть переходит от белого к черному (что хорошо, имхо) но остальная часть фона тоже превращается в черный, что плохо.
mchlfchr

3
Вы пробовали некоторые основные методы уменьшения изображения? Например, вычитание коррекции плоского поля, чтобы избавиться от затемнения в правом верхнем углу ( en.wikipedia.org/wiki/Flat-field_correction ). Кроме того, если частицы являются статичными, они будут немедленно удалены. Затем вы можете использовать любой метод обнаружения краев, какой захотите ...
PhilMacKay

Привет, Фил, насколько мне известно, и, насколько мне известно, есть серия снимков, которые снимаются до того, как объект попадает в печь. Вид калибровки поэтому здесь. Я поговорю с физиком, который отвечает за ПЗС и окружающую среду в понедельник. Но спасибо за совет, я попробую!
mchlfchr

Второе изображение, которое вы добавили, выглядит совершенно иначе. Можете ли вы опубликовать все возможные изображения?
Андрей Рубштейн

Ответы:


2

Вы можете попробовать следующее:


Привет оли, в отношении разреженных методов: не могли бы вы быть более конкретными, какие методы этого кода я должен использовать? Я не очень глубоко в этом разделе, и я не нашел что-то полезное в документах относительно устранения шума или размытия ... Заранее спасибо.
mchlfchr

1
Вы можете найти «более простую
oli

извините, что жаловался в другой раз ;-) ... у вас есть также источники win32? еще раз спасибо!
mchlfchr

Я боюсь, что я не ...
Оли

2

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

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

Посмотрите на все значения в первой группе:

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

Чтобы найти моды в тримодальной гистограмме, можно использовать кластеризацию K-средних с K=3интенсивностью. Следующий код Matlab находит th1=67в вашем коде. Идея состоит в том, чтобы предположить, что у вас есть 3 набора, и рассчитать взвешенный центроид для каждого. Затем каждый уровень интенсивности назначается своему кластеру. Вы останавливаетесь, когда взвешенные центроиды перестают двигаться. Вот результат нахождения двух порогов на вашем изображении, показанных на гистограмме.

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

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

Решение проблемы - это просто пирог, просто сделайте несколько простых морфологических операций, таких как открытие.


1
Привет, Андрей, но как мне сделать обобщение той пороговой величины, о которой ты говорил? У меня есть несколько дел, не только этот, и мне все еще нужна автоматизация. И Otsu Thresholding (функция в Matlab) не дал мне хороших результатов. Любые дальнейшие намеки? С
наилучшими

Привет еще раз, спасибо, но код не работает. Появится пустой экран. Попробовал его с моими исходными данными (растровыми изображениями) и PNG, который вы разместили выше. Я пока что отлаживаю ...
mchlfchr

@mchlfchr, у вас есть набор инструментов для обработки изображений? Если нет, то можно поменять imhistнаhist
Андрей Рубштейн

@mchlfchr, смотрите обновленную версию
Андрей Рубштейн

Андрей, если я вставлю исходный файл растрового изображения, результаты будут такими, как я упоминал в моем исходном посте. Может быть, это происходит в отношении резолюции? Исходное изображение составляет 576x768 пикселей и оттенки серого (256). Вот результаты, если я использую вашу функцию с моим исходным изображением: i.imgur.com/UXALJ.png Гистограмма-показатель вашей функции: i.imgur.com/7RiPP.png Спасибо за вашу помощь! С
наилучшими

1

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

Я бы посоветовал сделать фоновую реконструкцию с помощью простой модели (возможно, плоской [3 DOF] или квадратичной [6 DOF]), выбрав небольшое количество значений в светлых областях. Лучше всего использовать небольшие ROI для усреднения шума. Затем исправьте затенение путем вычитания (или деления на) фоновых значений.

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

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


Привет Ив, автоматизированная обработка предпочтительнее. Аспект DOF интересен, но я не уверен насчет метода Otsu, потому что сам Otsu не работает хорошо. Правильно ли я понимаю, что вы хотите выбрать случайные области изображения, а затем вы бы порог после среднего значения для всех выбранных областей? С
наилучшими

1

Я думаю, что лучше всего использовать активные контуры. Если вы не знаете, что такое активные контуры, посмотрите это видео на YouTube http://www.youtube.com/watch?v=ijNe7f3QVdA.

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

Вот реализация активных контуров, которые вы можете использовать http://www.mathworks.com/matlabcentral/fileexchange/19567


Добро пожаловать на dsp.se :) Спасибо за помощь, вы предоставили хороший ответ. Если вы хотите сделать его еще лучше, я думаю, что было бы интересно дать ответы на некоторые из этих вопросов: Почему вы думаете, что это лучший подход (например, у вас есть личный опыт работы с техникой)? Какой из уже предложенных подходов, по вашему мнению, будет хорошо работать в сочетании с вашим предложением? Предложите краткое объяснение методики или, если у вас есть время, попробуйте представить экспериментальные результаты, используя методику на приведенных в качестве примера изображениях. И веселиться на DSP!
Пенелопа

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

Как насчет того, чтобы взглянуть на методы шумоподавления. Вы можете найти их краткое изложение здесь: lnmiitdip.files.wordpress.com/2011/12/…
mkuse

1
@mkuse, я уже упоминал о механике, которую вы опубликовали в своем PPT-файле, в моем первоначальном посте. Я отредактировал свой первый пост, чтобы было более понятно, какие фильтры я использовал.
mchlfchr

0

Вы четко знаете, о чем вы, но вы не упомянули об использовании порогового значения, в частности пытались ли вы применить глобальный порог, используя Otsu для вычисления правильного уровня, затем найти контуры и выбрать самый большой?

[Изменить, чтобы уточнить]

Глобальный порог, очевидно, не будет работать из-за видимого отклонения изображения.

Я быстро поиграл с этим и обнаружил, что если вы разбиваете изображение на 6 частей (2 строки по 3 столбца одинакового размера), затем выполняете установку порога с использованием Otsu для каждого из них, а затем собираете заново, это делает довольно хорошую работу по очистке образ.

В верхней правой части звезды все еще есть небольшие артефакты.

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


Привет Дэйв, я попробовал Оцу, но это дает эффект, что правый верхний фон сливается с объектом, что абсолютно недопустимо.
mchlfchr

Привет, Дейв, Hough не вариант, из-за требований времени выполнения, и, насколько я знаю о HT, это очень много времени для больших изображений.
mchlfchr

0

Контуры всегда прямые или известные кривые?

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


1
Как я уже упоминал: мне нужны близлежащие подходы в реальном времени. И насколько я знаю HT, это очень много времени. Другой аспект заключается в том, что я не знаю кривых, и линии не всегда прямые. Контур зависит от материала, который находится в печи (для получения дополнительной информации см. Мой исходный пост).
mchlfchr

Для прямых линий это довольно быстро, и если вы примерно знаете, где находятся линии (например, из предыдущего кадра), вы можете искать только это пространство параметров
Martin Beckett
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.