Випуск сегментації зображень з різних матеріалів


15

Привіт, спільнота з розпізнавання образів

У мене є серйозна проблема щодо сегментації зображення. Сценарій - це атмосфера всередині печі, яка змушує мою голову божевільною. І мені потрібно виявити контури об'єктів з різних матеріалів (скло, кераміка, Al, Ir, ..) за короткий проміжок часу (<10 секунд), а не лише для одного особливого випадку. Мені також потрібен контур в послідовному рядку пікселів для коду. Тому необхідний також ланцюговий код або так званий кордон / контур, тому відкриті отвори - це не добре. На задньому плані - нелінійні шуми, приблизно від пилу, частинок або дещо іншого, які час від часу з’являються.

Пропозиції Matlab або OpenCV вітаються.

Щоб зробити це більш зрозумілим, я розмістив ще одне зображення своєї мети та напівпрозорий об’єкт, який також потрібно виявити. Також додаткові приклади, які потрібно пам’ятати. приклад1 приклад2 приклад3 приклад4

Як ви бачите на Зображенні №1, у правій частині зображення та поблизу зовнішнього контуру зірки, що є об’єктом, є частинки. Також загальний контраст не дуже хороший. Сам об’єкт стоїть на підземці, що не має значення для виявлення контуру. На зображенні №2 зображений напівпрозорий об'єкт, що також можливо.

Я хочу знайти контур / периметр цього об’єкта, як на наступному екрані (червона лінія). Два прямокутника (жовтий) позначають початкову (ліву) та кінцеву точку (праворуч). Синя лінія - це нехтування. приклад2

Спочатку я думав, що зможу вирішити проблему тієї брудної атмосфери просто фільтрами. Але після поважної кількості вкладеного часу я просто зрозумів, що мені потрібно значно зменшити або зменшити шум, щоб збільшити контраст переднього плану та фону. Я спробував багато методів, таких як вирівнювання гістограми, адаптаційне вирівнювання Otsu, лінійні фільтри (наприклад, гаусси), нелінійні фільтри (медіана, дифузія), активні контури, k-засоби, нечіткі c-засоби, а також Canny для чистого Виявлення країв у поєднанні з морфологічними операторами.

  • Кенні: Частинки та атмосфера викликають дірки, але мені потрібен повний контур предмета. Однак із закриттям, розширенням морфологічних операторів це недостатньо добре. У Кенні все ще найкращі результати з усіх методів, які я вивчав через гістерезис.
  • Активні контури: Вони також працюють на ребрах / градієнтах, вони діють абсолютно божевільно після ініціалізації всередині об'єкта, що, можливо, викликано картою ребер, що призводить до відкритого об’єкта. Наскільки мені відомо, контур повинен бути закритим. Пробували його з різними похідними (GVF / VFC / Classic Snake).
  • k-Значення: Результати включають атмосферу печі через туманний фон. Те саме для нечітких-с-засобів. Я вибрав два кластери через відмежування об’єкта від фону. Більше кластерів призводить до слабших результатів.
  • Гістограма / Оцу: Через дуже близьку сіру інтенсивність (імхо!) Вона об'єднує об'єкт з фоном. Спробували це локальними та глобальними методами.
  • Фільтри: Особливо GLPF або інші LPF змащують краї, що не так добре і навіть не зменшує туманну атмосферу.
  • Нелінійні фільтри зберігають краї. Більшість з них займає занадто багато часу для обчислення великих зображень. Зараз скористався швидким двостороннім фільтром. Результати дивіться нижче.

Тому жоден метод недостатньо хороший для етапів після обробки, оскільки отримані результати об'єктного сегмента погано конкурують з існуючим алгоритмом. Цей існуючий алгоритм дуже локальний, тому він працює для цього дуже особливого сценарію.

Тож я запитую вас, якщо я щось зовсім пропустив ... Я більше не маю уявлення, як обробити і як я повинен отримати хороші контурні результати, не маючи прогалин чи дірок. Чи можливо це, не вносивши багато змін на CCD та фізичне середовище? Спасибі заздалегідь!

Останній підхід поки що (після довгої ночі експериментів з МО):

  • Двосторонній фільтр (збереження краю, але згладжування однорідних ділянок)
  • Кенні (Сигма = 2, Поріг = [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
Привіт, Андрію, але як мені зробити узагальнення цього порогу, про який ти згадав? У мене було кілька випадків, не тільки в цьому, і мені ще потрібна автоматизація. І Поріг Оцу (функція в матлабі) не дав мені хороших результатів. Будь-які підказки? З повагою
mchlfchr

Привіт ще раз, спасибі поки що, але код не працює. З'явиться екран порожньої фігури. Спробував це за допомогою моїх оригінальних даних (растрових зображень) та PNG, який ви розмістили вище. Я тим часом налагоджую ...
mchlfchr

@mchlfchr, чи є у вас інструментарій для обробки зображень? Якщо ви цього не зробите, можливо перейти imhistнаhist
Андрій Рубштейн

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

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

1

Як було запропоновано вище, поріг може бути дуже ефективним для цього зображення, яке по суті є двійковим, за винятком того, що постійний поріг не зробиться через нерівномірне освітлення. Вам потрібне адаптивне визначення порогу.

Моєю порадою було б зробити реконструкцію фону за допомогою простої моделі (можливо, планарної [3 DOF] або квадратичної [6 DOF]), шляхом вибірки невеликої кількості значень у світлих областях. Найкраще використовувати невеликі рентабельності інвестицій, щоб оцінити рівень шуму. Потім виправте затінення, віднісши (або розділивши) фонові значення.

Якщо взаємодія між людьми не є можливою, ви можете автоматизувати пошук фонових областей спочатку прямим Otsu та розглядаючи рівномірні рентабельності інвестицій (низька дисперсія) далеко під поріг. Після першої реконструкції фону, ви, ймовірно, можете покращитись, застосувавши цей процес до плоскоскорегованого зображення.

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


Привіт, Іве, переважна автоматизована обробка. Аспект DOF цікавий, але я не впевнений у методі Otsu, оскільки сам Otsu працює недостатньо. Я правильно розумію, що ви хочете вибрати випадкові ділянки зображення, і тоді ви будете пороговими за середнім значенням для всіх вибраних областей? З повагою
mchlfchr

1

Я думаю, що найкращим способом є використання активних контурів. Якщо ви не знаєте, які активні контури, перегляньте це відео на YouTube http://www.youtube.com/watch?v=ijNe7f3QVdA

В основному, вам потрібно дати ініціалізацію сегментації, і це покращить форму. Моя пропозиція полягає в одному з методів, обговорених в цьому пості, і використовувати активні контури як другий крок, тобто. як крок вдосконалення.

Ось реалізація активних контурів, якими ви можете скористатись 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 на кожному, а потім знову зібрати, це робить досить хорошу роботу при очищенні зображення.

У верхній правій частині зірки є ще незначні артефакти.

Мені здається, що оскільки у об'єкта є межі прямої лінії, ви можете розглянути перетворення Хаффа, щоб отримати ці краї, перетинати їх, щоб знайти вершини та використовувати результат як контур об'єкта.


Привіт Дейв, я спробував Otsu, але це призводить до того, що правий верхній фон зливається з об'єктом, що абсолютно неприпустимо.
mchlfchr

Привіт, Дейв, Хоф - це не варіант, через вимоги до часу виконання, і наскільки я знаю про HT, це вимагає великих витрат часу для великих зображень.
mchlfchr

0

Чи завжди обриси прямі або відомі криві?

Якщо так, то замість того, щоб намагатись отримати кожен піксель уздовж краю правильним, я б використав перетворення Хауфа, щоб отримати рівняння ліній, а потім відтворити лічильники з ліній та інерційних розділів


1
Як я вже згадував: мені потрібні підходи в режимі реального часу. І наскільки я знаю HT, це забирає багато часу. Інший аспект полягає в тому, що я не знаю кривих, а лінії не завжди прямі. Контур залежить від матеріалу, який знаходиться в печі (для отримання додаткової інформації дивіться мій пост походження).
mchlfchr

Для прямих це досить швидко, і якщо ви приблизно знаєте, де знаходяться лінії (наприклад, з попереднього кадру), ви можете шукати лише цей параметричний простір
Мартін Бекетт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.