Лучший способ сегментации вен в листьях?


47

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

Все мои изображения - серые

РЕДАКТИРОВАТЬ: мое исходное изображение

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

После порога

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

Как следует из ответа, я попробовал следующее обнаружение края

  1. благоразумный

Слишком много шума и нежелательных помех

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

  1. Собела

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

  1. Робертс

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

РЕДАКТИРОВАТЬ: попробовал еще одну операцию, я получаю следующий результат лучше, чем то, что я пытался с хитрым и адаптивным Что вы чувствуете?

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


Не могли бы вы показать нам несколько изображений?
Джонас

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

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

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

Из изображений, которые вы дали, похоже, что вы используете (различные) фильтры для порогового изображения. Это даст крайне плохие результаты. Вы должны использовать фильтры на исходном изображении, затем пороговое значение их вывода.
Бенджон

Ответы:


56

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

фильтровать образцы

ДОБАВИТЬ : Если бы вас попросили объяснить разницу между детектором краев и детектором гребней более четко. Я заранее прошу прощения, если этот ответ становится очень длинным.

Детектор края (обычно) является первым производным оператором: если вы представляете входное изображение в виде трехмерного ландшафта, детектор края измеряет крутизну наклона в каждой точке этого ландшафта:

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

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

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

Это также объясняет «двойную линию» в результатах детектора краев Canny:

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

Итак, как вы обнаруживаете эти тонкие линии (то есть гребни), тогда? Идея состоит в том, что значения пикселей можно (локально) аппроксимировать полиномом 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)

Производная матрица второго порядка называется " Гессенская матрица ". Он описывает структуру второго порядка, в которой мы заинтересованы.(2gx22gxy2gxy2gy2)

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

Какие формы могут иметь это приближение функции? На самом деле, не так много

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

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


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

ребристый фильтр

Как видите, для каждой тонкой темной линии есть только один пик. Бинаризация и скелетизация дают:

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

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

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

Полный код Mathematica:

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)

Итак, вам нужно вычислить вторые производные , , (используя sobel или производную гауссовского фильтра) и вставить их в выражении выше, и у вас есть свой фильтр гребня. H xy H yyHxxHxyHyy


Да, это именно то, чего я хочу, однако я делаю это в Matlab, и найти эквивалент фильтра гребня стало трудно
vini

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

@Mohammad: Я пытался, я надеюсь, что теперь это стало немного понятнее, несмотря на математику
Ники Эстнер

я попробовал фильтр гребня не дает удовлетворительных результатов
Vini

2
@vini: «не дает удовлетворительных результатов», на самом деле мне мало что говорит. Вы получаете то же самое изображение результата как тот, который я отправил? Что такое "неудовлетворительно"?
Ники Эстнер

6

При использовании обнаружения края Канни (в Halcon), когда альфа равна 1, а нижний порог 8 и верхний порог 13 (по шкале 1-255), я получаю следующий результат:

Кэнни край обнаружения листа

С настройкой параметров, результат, который вы получили от Canny, может быть значительно улучшен. Используя это изображение, вы можете пропустить короткие края, чтобы удалить шум, и соединить длинные края для конечного результата.

Кстати: другой цвет указывает на другой край.

Я могу получить довольно похожий результат, используя этот онлайн детектор краев Canny :

  • Выберите картинку I9Pxl.png
  • Сигма 1.2
  • T-низкий 0,04
  • T-высокий 0,07
  • Другие настройки по умолчанию
  • Нажмите обновить вид для результата

Спасибо :) Я думаю, что Canny просто лучший;) Кстати, применение Canny к вашему результату может привести к еще лучшим результатам ..
Geerten

Кстати, если вы не заметили: каковы ограничения детектора краев Canny? Вы можете высказать свое мнение здесь!
Дипан Мехта

Если вы говорите мне: я уже высказал свое мнение по вашему вопросу. Если вы оставляете комментарий в целом, я удалю этот комментарий.
Гертен

Ах да, я этого не осознавал!
Дипан Мехта

Спасибо за ваш ответ, однако canny не сохраняет мелкие детали вен в листьях, которые не обнаружены, как вы показали ...
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 должен быть двумерным массивом.
Мэтью Шунь-Шин

На самом деле, i1это большее из собственных значений, поэтому вы должны использовать это.
Роб

Это самое ясное объяснение, которое я когда-либо видел!
Эврика

3

Вместо порога я применил простое обнаружение краев.

Используется GIMP с разницей от Гаусса - Radious Outer: 3.0 и Inner: 1.0.

Вот как это выглядит.

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

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

Вот страница, которая объясняет реализацию GIMP.

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

И этот ответ Как лапласиан используется для маски нерезкости?


GIMP? какой крайний детектор?
Вино

1
Нет - это пакет для редактирования изображений. Это была быстрая проверка - просто чтобы поставить точку вперед. - использовать обнаружение краев, а не пороговое.
Дипан Мехта

Какой детектор края использует GIMP? я сожалею, что очень мало знаю об этом
vini

@vini добавил ссылку.
Дипан Мехта

3

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

В моих ответах на ранее заданные похожие вопросы о стековом обмене ( Q1 и Q2 ) использовался алгоритм выделения субпиксельной криволинейной структуры Стегера. Этот метод работал достаточно хорошо во многих случаях и, к счастью, включая этот. Поэтому я публикую выходное изображение здесь: введите описание изображения здесь и здесь с другой настройкой параметров и без окраски подключений: введите описание изображения здесь подробности и правильные ссылки см. В сообщениях stackexchange, на которые я ссылался.


0

В рамках моего последнего года инженерных исследований мне пришлось изучать методы сегментации кровеносных сосудов на изображениях глазного дна. Я нашел этот метод восстановления деревьев (Коэн, Лоран Д. и Милль, Жюльен особенно интересным для использования вместе с Методами быстрого марширования).

Другие документы, которые вы можете посмотреть:

  • Геодезические Активные Контуры
  • О реализации быстрых маршевых методов для трехмерных решеток
  • Multistencils FMM: высокоточное решение уравнения Эйкона на декартовых областях

Полезные ссылки: - Распространение фронта в 2D и 3D

Я надеюсь, что это немного помогает, хотя это не совсем современный уровень.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.