Выполнили: Бакина Ксения, Круглов Алексей.
Результаты обработки изображений расположены в таком порядке:
1 - исходное изображение
2 - изображение после применения фильтра erode
3 - обработка изображения 2 с применением функции watershed
4 - изображение после применения фильтра fastNlMeansDenoisingColored
5 - обработка изображения 4 с применением функции watershed
6 - изображение после применения фильтра medianBlur
7 - обработка изображения 6 с применением функции watershed
Обработка изображений состоит из двух этапов:
1) Удаление шума с помощью трех разных фильтров(erode, fastNlMeansDenoisingColored, medianBlur)
erode - размывает(операция сужения) изображение с использованием ядра(kernel)
(изображение формируется из локальных минимумов — т.е. будут увеличиваться тёмные области)
medianBlur - медианный фильтр - реализован с помощью скользящей подматрицы(ядра) определенной
размерности NxN пикселя. На вход он принимает N^2 значений (пикселей), а на выход выдаёт
одно, которое выбирается по следующему правилу: в отсортированном в порядке возрастания
последовательности входных пикселей выбирается серединный результат(медиану).
fastNlMeansDenoisingColored - фильтр Non-Local Means(нелокальный сглаживающий фильтр)
находит похожие области изображения и применяет информацию из них для взаимного усреднения.
2) Сегментация изображений с помощью алгоритма водораздела(функции watershed)
Для алгоритма водораздела нужно определить маркеры.
Маркеры - это пиксели, в которых мы уверены, что они принадлежат объектам,
присутствующим на изображении(с них начинается заливка).
В нашей задаче 3 маркера: здоровая часть листа, больная часть листа и фон.
В нашем решении мы отмечает здоровый лист и фон, а всё остальное считается поражениями листа.
Для каждого изображения подобраны свои маркеры. Это обусловлено многими
факторами: листы на изображениях не всегда расположены посередине, каждый
лист уникален, поэтому трудно подобрать именно те координаты, где находится
здоровый участок листа, и самое важное на каждой фотографии разное освещение.
Освещение играет огромную роль. На одних изображениях цвет листа ровный, без
засветов, теней тоже не много, а на других множество засветов, теней, перепадов
цвета, логично, что фильтры будут работать хуже. Например, на 3 и 5 изображениях
освещение "плохое" для фильтров, они определяют черешок листа как больной
участок. И добавление/изменение маркеров не исправило этого, иногда даже ухудшало результат.
Если посмотреть на код, то можно заметить, что размер kernel для каждого
изображения разный. Это обусловлено тем, что фильтр erode очень чувствителен
к изменению этого параметра. Для 1,3 и 7 изображения размер kernel равен 3, цвет
листа достаточно хорошо отличим от больных участков. На зображенях 2,5,8 много
засветов, цвет листа варьируется от темно-зеленого до почти белого, поэтому фильтры
работают лучше на большем размере kernel. А также мы заметили, что размер ядра оптимальный
для фильтра erode улучшает результат фильтра fastNlMeansDenoisingColored, если передавать
размер ядра в 3(h - параметр, регулирующий силу фильтра для яркостной составляющей) и
4(templateWindowSize - размер в пикселях шаблона, который используется для вычисления
весов) параметрах.
У фильтров medianBlur и fastNlMeansDenoisingColored очень близки результаты, erode
достаточно сильно отличается и чаще работает хуже остальных: определяет тень как поражение
листа, а не часть фона. На одноих изображениях лист и фон хорошо отличимы, а на некоторых
изображениях край листа настолько затемнён или засветлён, что при попытке устранения
неправильного определения тени часть листа тоже распознается как фон.
Фильтр medianBlur размывает изображение сильнее остальных фильтров. Где-то это помогает лучше точнее
определить поражения листа, а где-то наоборот мешает распознаванию больных участков листа.
Например обратим внимание на изображение 5. По середине листа есть достаточно темные группы пикселей,
которые относятся к поражениям листа, хотя ими не являются. И лучше всех эти неточности убирает именно medianBlur.
Теперь посмотрим на изображение 1. В правой части листа есть совсем небольшие больные участки, erode и
fastNlMeansDenoisingColored их определяют, а medianBlur нет.
По изображениям можно заметитить, что фильтр fastNlMeansDenoisingColored выдает средний результат между
результатами работы erode и medianBlur.
img 1:
img 2:
img 3:
img 5:
img 7:
img 8: