OpenCV: обнаружение краев

Это третье введение в OpenCV. Это пошаговое руководство для изучения OpenCV на Python. Мы рассмотрим концепции обнаружения кромок и функцию обнаружения контуров Canny в OpenCV.

Края определяют границы объекта. Многие детали изображения могут быть удалены, а объект по-прежнему идентифицирован по его краям. Возьмем, к примеру, собаку ниже. Слева - исходное изображение, а справа - его двоичная форма. Многие детали, такие как цвета и фон, были удалены, но края сохранили множество деталей, которые помогают определить, что является объектом на изображении.

Компьютеры любят двоичные файлы. Это быстро и просто (1 or 0). Техника получения краев изображения очень полезна, когда дело доходит до предварительной обработки изображения для обнаружения объекта. Он преобразует изображение в простейшие формы, удаляя ненужные детали, которые бесполезны, и оставляет интересный аспект.

На наш взгляд, очень легко понять, каковы края собаки. Однако как мы можем заставить компьютер делать то же самое?

Концепция обнаружения края

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

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

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

Алгоритм Canny Edge

Самый популярный алгоритм обнаружения краев - Canny Edge. Разработанный Джоном Ф. Кэнни в 1986 году, он стал наиболее широко используемым алгоритмом благодаря своей точности и низкому уровню ошибок. Изображение проходит несколько этапов обработки, прежде чем будет получен окончательный результат.

  1. Размытие по Гауссу применяется для удаления шума.
  2. Нахождение градиента интенсивности (яркости) изображения, как в простом примере выше.
  3. Примените не максимальное подавление, чтобы избавиться от пикселей, которые не являются краями для обработки.
  4. Применяет гистерезис. Предположим, у нас есть два порога U и L. Все, что выше U, является ребром, а все, что ниже L, - нет. Между ними может быть что угодно. С помощью гистерезиса мы можем сказать, считается ли потенциальный кандидат на ребро, который связан с проверенным сильным ребром, ребром, потому что ребра имеют тенденцию продолжаться в реальной жизни.

В OpenCV

К счастью, OpenCV предоставляет несколько функций обнаружения границ как часть своего API, и одна из них - Canny(image, L, U). В моем примере он принимает три параметра:

  • Изображение
  • L: нижнее пороговое значение. Любое значение ниже L не считается краем.
  • U: верхнее пороговое значение. Любое значение выше U считается ребром.
import cv2
# Reading the image in grey scale indicated by the 0 parameter
image = cv2.imread('images/input.jpg',0)
# Showing original image
cv2.imshow('Original', image)
cv2.waitKey(0)
# Computing edges with Canny with thresholds 50 and 120
# then showing it
canny = cv2.Canny(image, 50, 120)
cv2.imshow('Canny', canny)
cv2.destroyAllWindows()

Результаты:

Что дальше?