Найкращий спосіб сегментації жилок на листках?


47

Я провів багато досліджень і виявив такі методи, як адаптивне порогове значення, вододіл тощо, які можна використовувати для виявлення жилок на листках. Однак порогове значення не дуже добре, оскільки воно вносить багато шуму

Усі мої зображення є сірим зображенням, будь ласка, хто-небудь може підказати, які підходи використовувати, розглядаючи цю проблему, вкрай потребуючи допомоги

EDIT: Моє оригінальне зображення

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

Після порогування

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

Як запропонував відповідь, я спробував наступне виявлення краю

  1. Кенні

Занадто багато шуму та небажаних збурень

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

  1. Собель

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

  1. Робертс

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

EDIT: Перепробував ще одну операцію, я отримав наступний результат його кращий, ніж те, що я спробував з canny та adaptive Що ви відчуваєте?

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


Чи можете ви, будь ласка, покажіть нам кілька зображень?
Йонас

Я додав зображення
vini

@vini Ви зараз робите це як крок попередньої обробки, щоб згодом отримати хороший збіг шаблонів? Крім того, як ви отримали друге зображення за допомогою простого визначення порогів?
Спейси

Моя мета - отримати найкращий можливий результат при сегментації вен, щоб мій вихід не містив бродячих артефактів, я використовував Адаптивний поріг, щоб отримати друге зображення
vini

З поданих вами зображень виглядає так, що ви використовуєте (різні) фільтри на пороговому зображенні. Це дасть надзвичайно погані результати. Ви повинні використовувати фільтри на оригінальному зображенні, а потім обмежувати їх вихід.
Benjohn

Відповіді:


56

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

фільтрують зразки

ДОДАТИ : Якщо вас попросили пояснити різницю між крайовим детектором та рейнджером. Я заздалегідь вибачаюся, якщо ця відповідь стає дуже довгою.

Крайовий детектор є (як правило) першим похідним оператором: Якщо ви уявляєте вхідне зображення як 3D-пейзаж, то крайовий детектор вимірює крутизну схилу в кожній точці цього пейзажу:

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

Якщо ви хочете виявити межу розширеної яскравої або темної області, це просто чудово. Але щодо жил на зображенні ОП він надасть вам точно так само: контури ліворуч та праворуч від кожної жилки:

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

Це також пояснює "схему подвійної лінії" в результатах детектора ребра Кенні:

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

Отже, як ви виявите ці тонкі лінії (тобто пасма)? Ідея полягає в тому, що значення пікселів можуть бути (локально) наближені поліномом 2-го порядку, тобто якщо функцією зображення є , то для малих значень і :gxy

g(x,y)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

або, у матричній формі:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

Матриця похідного другого порядку називається " Гессіанська матриця ". Він описує структуру 2-го порядку, яка нас цікавить.(2gx22gxy2gxy2gy2)

Частину 2-го порядку цієї функції можна перетворити на суму двох парабол повернутих на деякий кут, розклавши матрицю Гессі вгорі на обертання на діагональну матрицю її власних значень ( Розкладання матриці ). Нас не хвилює обертання (ми хочемо виявити гребені в будь-якій орієнтації), тому нас цікавлять лише таλ1x2+λ2y2λ1λ2

Які форми можуть мати наближення цієї функції? Насправді, не так багато:

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

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


Хребет фільтр , ймовірно , дасть кращі результати. Я спробував вбудований Mathematica RidgeFilter(який обчислює основне власне значення матриці Гессі на кожен піксель) на вашому зображенні:

коньковий фільтр

Як бачите, для кожної тонкої темної лінії існує лише один пік. Урожай бінарнізації та скелетонізації:

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

Після обрізки скелета та видалення дрібних компонентів (шуму) із зображення я отримую цей остаточний скелет:

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

Повний код математики:

ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]

ДОДАТИ:

Я не експерт по Matlab, я не знаю, чи має він вбудований фільтр хребта, але я можу показати вам, як реалізувати його "вручну" (знову ж таки, використовуючи Matematica). Як я вже сказав, хребетний фільтр є основним власним значенням матриці Гессі. Я можу обчислити це власне значення символічно в Mathematica:

eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]

=>12(Hxx+Hyy+Hxx2+4Hxy22HxxHyy+Hyy2)

Отже, що вам потрібно зробити - це обчислити другі похідні , , (використовуючи звуковий чи похідний гауссовий фільтр) і вставити їх в вираз вище, і у вас є ваш хребет-фільтр. H xy H yyHxxHxyHyy


Так, саме те, що я хочу, але я роблю це в matlab і знайти еквівалент хребта-фільтра стало важко
vini

1
@nikie Дуже приємна відповідь - запитання - чи можете ви, будь ласка, детальніше розглянути різницю між крайовим детектором та детектором хребта для нас, що не обробляють зображення? Ще раз дякую
Spacey

@Mohammad: Я спробував, я сподіваюся, що тепер це було трохи зрозуміліше, незважаючи на математику
Нікі Естнер

Я спробував фільтр хребта не дає задовільних результатів
vini

2
@vini: "не дає задовільних результатів" насправді мало що говорить мені. Чи отримуєте ви те саме зображення результату, що і те, що я розмістив? Що "незадовільно"?
Нікі Естнер

6

Використовуючи виявлення ребер Canny (у Halcon), альфа - 1, низький поріг 8 та високий поріг 13 (за шкалою 1-255), я отримую такий результат:

Лист виявлення краю Кенні

Завдяки налаштуванню параметрів результат, який ви отримали від Canny, можна значно покращити. Використовуючи це зображення, ви можете пропустити короткі краї, щоб усунути шум, і з'єднати довгі краї для остаточного результату.

BTW: інший колір позначає інший край.

Я можу отримати досить подібний результат, використовуючи цей онлайн-детектор ребра Кенні :

  • Виберіть зображення I9Pxl.png
  • Сигма 1.2
  • Т-низький 0,04
  • T-високий 0,07
  • Інші настройки за замовчуванням
  • Клацніть перегляд оновлення для отримання результату

Дякую :) Я думаю, Кенні просто найкращий;) Дорога, застосування Кенні на ваш результат може дати ще кращі результати ..
Geerten

BTW: Якщо ви не помічали: які обмеження мають детектор ребра Кенні? Ви можете висловити свої погляди тут!
Діпан Мехта

Якщо ви мені говорите: я вже висловив своє бачення щодо вашого питання. Якщо ви загалом даєте коментар: я видаляю цей коментар.
Гертен

О так, - я цього не усвідомлював!
Діпан Мехта

Дякуємо за вашу відповідь, проте Кенні не зберігає дрібні деталі прожилок на листках, які не виявляються, як ви показали ...
vini

6

Виходячи з вищезазначеної відмінної відповіді, ось як це зробити в python, використовуючи scikit funcitons.

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)

Що imgмає бути? У мене є pngфайл, і він не працює.
Сигур

img має бути 2d масивом numpy.
Метью Шун-Шін

Насправді, i1більша кількість власних значень, тому вам слід скористатися цією.
Роб

Це найяскравіше пояснення, яке я коли-небудь бачив!
Еврика

3

Замість порогу я застосував просте виявлення ребер.

Використовується GIMP з різницею Гауссан - Радіозний Зовнішній: 3,0 та Внутрішній: 1,0.

Ось як це виглядає.

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

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

Ось сторінка, яка пояснює реалізацію gimp.

Вам слід посилатися на різні методи, такі як Лаплаціан Гаусса чи Різниця Гауссіна тощо. Дивіться це: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7

І ця відповідь. Як застосовується лаплаціан для маски без гоління?


GIMP? який крайовий детектор?
vini

1
Ні - це пакет редагування зображень. Це була швидка перевірка - просто поставити крапку вперед. - Використовуйте виявлення краю на відміну від порогів.
Діпан Мехта

Який крайовий детектор використовує GIMP? Вибачте, я знаю про це дуже мало
vini

@vini додав посилання.
Діпан Мехта

3

Ця тема завжди викликала велику зацікавленість, і все ж реальної консенсусу щодо цієї теми не існує. Тому я вирішив упустити кілька слів.

Мої відповіді на раніше задані подібні запитання щодо stackexchange ( Q1 і Q2 ) включали алгоритм вилучення криволінійної структури підпікселів Steger. Цей метод спрацьовував досить добре у багатьох випадках і на щастя, включаючи цей. Тому я розміщую тут вихідне зображення: введіть тут опис зображення і тут з іншим налаштуванням параметрів і без забарвлення підключеності: введіть тут опис зображення Деталі та відповідні посилання див. У публікаціях stackexchange, на які я посилався.


0

У рамках мого останнього року завдання з інженерних досліджень мені довелося вивчити методи сегментації судин на знімках очного дна. Мені цей метод реконструкції дерева (Коен, Лоран Д. та Мілль, Жюльєн був особливо цікавий для використання разом із методами швидкого маршування).

Інші документи, які ви можете переглянути:

  • Геодезичні активні контури
  • Про реалізацію методів швидкого маршування для 3D грат
  • Мультиінструменти FMM: високоточне рішення рівняння Ейконала на декартових доменах

Корисні посилання: - Фронтальне поширення в 2D та 3D

Я сподіваюся, що це трохи допомагає, хоча це не зовсім сучасний стан.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.