Оглавление. Продолжим изучение компьютерного зрения. Начало здесь. Напомню краткое содержание предыдущих уроков. Мы изучили этапы анализ и обработки изображений, установку OpenCV, простейшие действия над изображением, такие как преобразование в черно-белый формат, изменение размеров, накладывание фильтра размытия.  Сегодня продолжим тему обработки изображений. На прошлом уроке мы пытались при помощи размытия удалить из изображения такие дефекты, как гауссовский шум и царапины. С первым что-то более-менее получилось, а вот с царапинами ничего не вышло. Да, кстати, в комментах мне был задан вопрос: «Откуда берется гауссовкий шум?»  Отвечаю:  Гауссовский шум может возникнуть, например, от помех. Или, если у нас было плохое освещение, картинка получилась темная, и мы попытались как-то исправить это, например, увеличить контрастность. Шумы при этом тоже усилятся. Ладно. Идем дальше. Как же нам быть с царапинами? А для их удаления можно воспользоваться медианным фильтром: Вот исходная картинка: А вот мы применили к ней фильтр 3 на 3: Как видим, царапины уменьшились. Но не полностью. Попробуем фильтр размером 5 пикселей: Как видим, с дефектами типа царапин фильтр справляется, хотя не всегда. А с гауссовсикм шумом? Давайте проверим: Исходная картинка: Обработанная медианным фильтром 5: Как видим, с гауссовским шумом медианный фильтр справляется плохо.  Фильтр на изображение можно наложить и виде линейной свертки с определенной матрицей. Гауссовский фильтр, кстати, частный случай такого линейного фильтра. Как происходит фильтрация? Мы берем скользящее окно, попиксельно умножаем яркость каждого пикселя этого окна на коэффициент в матрице, складываем и результат записываем в центральную точку окна. Потом окно сдвигаем на один пиксель и делаем то же самое. И так пока не пройдем по всему изображению. Например, при помощи фильтра: Можно повысить резкость изображения: Вот как это будет выглядеть: Среди линейных фильтров есть специальные матричные фильтры, которые подготавливают изображение к следующему этапу – поиску фич. Например, фильтр Собеля: Вот эффект от применения данного фильтра: Мы применили его к цветному изображению, но обычно такие фильтры применяют к черно-белому изображению: И вот как выглядит результат: Как видим, фильтр Собеля позволяет обозначить на изображении контуры. Правда, только обозначить, а не выделить. Для выделения контуров необходимо повторно обойти изображение, полученного фильтром, и уже на нем найти контуры. Что делать с этими контурами дальше – уже другой вопрос, мы до этого еще доберемся. А пока рассмотрим следующий фильтр – лапласиан: Вот эффект от его применения (к черно белому изображению): Как видим, тут контуры  обозначены более качественно. Но, тем не менее, это еще не выделение контуров. Это лишь заготовка, называемая контурный препарат. И с ним необходимо так же делать то, что было описано выше: повторно обойти изображение, полученное фильтром, и уже на нем найти контуры. К счастью, в OpenCV есть функция нахождения контуров, которая делает все, что нужно, чтобы выделить контур. Вот фрагмент кода, который выделяет контур И вот результат работы этой программы: Если качество выделения контуров не устраивает, можно поиграться с порогом, например, если порог поставить 50, то мы увидим вот такую картинку: А вот так будет выглядеть контур, если порог сделать 150: Для наглядности попробуем другую картинку: Выделив контур (порог 180), мы очень наглядно увидим линии крыш зданий  А теперь снова поговорим о предобработке. Вернемся к медианной фильтрации, и попробуем сначала применить к изображению этот фильтр, а уже потом выделить контур: Вот что у нас получится: Проиграемся с порогом, я поставил 100, и вот мы уже видим на контуре вменяемое очертание здания: Ладно. Вот выделили мы контур. Что дальше? А дальше уже идет следующий этап: промежуточная фильтрации. Собственно говоря, само выделение контура – это уже начало данного этапа, так как по контуру мы можем обнаружить области интереса. Например, границы, углы. Мы можем даже, используя контур, приступить к третьему этапу – поиск фич.  Что можно сделать с контуром? Например, следующее: Выявить различные геометрические примитивы (прямые, окружности). Превратить в цепочки точек и уже их отдельно анализировать.  Описать как граф и применять к нему алгоритмы на графах.   Программист