Задание 3. Детектирование контуров

Обязательная часть задания

Должны быть реализованы следующие алгоритмы:

  • Вычисление модуля градиента, используя свёртки с производными функции Гаусса.
  • Подавление немаксимумов модуля градиента (составная часть алгоритма Канни).
  • Конечный результат алгоритма детектирования контуров Канни.

Модуль градиента должен быть отнормирован таким образом, чтобы максимальное значение модуля градиента стало равно 255: после вычисления модуля градиента стоит найти максимальное значение gmax и умножить результат на 255 / gmax.

Результатом работы алгоритма Канни является бинарная маска: значения пикселей должны принимать значения только 0 или 255.

В алгоритме Канни должны быть корректно реализованы все его вспомогательные этапы: вычисление модуля градиента, подавление немаксимумов и гистерезис. Входными параметрами алгоритма Канни являются три числа: параметр фильтра Гаусса (сигма), используемый для вычисления производных, и два пороговых значения, задаваемых в виде коэффициентов относительно gmax — максимального значения модуля градиента на изображении.

Дополнительная часть задания

Должен быть реализован следующий алгоритм:

  • Выделение сосудов на изображениях глазного дна с помощью алгортма детектирования хребтовых структур (ridge detection).

Алгоритм ridge detection реализуется аналогично алгоритму Канни с той разницей, что:

  • Вместо модуля градиента берётся максимальное по модулю собственное значение матрицы Гессе.
  • В качестве направления для подавления немаксимумов берётся собственный вектор для данного собственного значения.

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

Проверку на "хребтовость" (|L1| >> |L2|) можно опустить.

Результат подавления немаксимумов должен быть отнормирован до диапазона [0, 255] аналогично обязательной части задания.

Результатом выделения сосудов является объединение отнормированных изображений после подавления немаксимумов, полученных для различных значений параметра фильтра Гаусса (сигма). Рекомендуется использовать значения 2, 3 и 4. Объединение представляет собой попиксельное взятие максимума.

Рекомендации

  • Частой ошибкой при вычислении градиента изображения является свёртка с производной одномерной функции Гаусса. Правильно брать двумерную функцию Гаусса и вычислять производные двумерной функции.

Формат параметров командной строки

Программа должна поддерживать запуск из командной строки со строго определённым форматом команд:

python main.py (command) [parameters...] (input_image) (output_image)

Список команд:

grad (sigma)   Вычисление модуля градиента
nonmax (sigma)   Результат немаксимального подавления
canny (sigma) (thr_high) (thr_low)   Детектирование границ с помощью алгоритма Канни. Первый параметр — сигма для вычисления градиента, следующие два параметра — вещественные числа — больший и меньший пороги соответственно
vessels   Детектирование сосудов согласно предложенному алгоритму

Примеры изображений


Исходное изображение

Модуль градиента для σ = 1
grad 1

Модуль градиента для σ = 2
grad 2

Модуль градиента для σ = 4
grad 4

Немаксимальное подавление для σ = 1
grad 1

Немаксимальное подавление для σ = 2
grad 2

Немаксимальное подавление для σ = 4
grad 4

Детектирование контуров для σ = 2
canny 2 0.3 0.3

Детектирование контуров для σ = 2
canny 2 0.3 0.1

Детектирование контуров для σ = 2
canny 2 0.1 0.03

Детектирование контуров для σ = 4
canny 4 0.3 0.3

Детектирование контуров для σ = 4
canny 4 0.3 0.1

Детектирование контуров для σ = 4
canny 4 0.1 0.03

Исходное изображение

Результат выделения сосудов
vessels

Справочные материалы