На собеседовании меня спрашивали об обработке изображений, а там мне задавали вопросы о краях, в то время я не очень интересовался теоретическими аспектами вещей, а скорее был человеком типа «давайте реализуем и посмотрим». И само собой разумеется, я ужасно потерпел неудачу, когда они начали углубляться в эту простую концепцию. И после той неудачи я понял, чувак! столько всего осталось, прежде чем я смогу считать себя инженером по компьютерному зрению. Так что, если вы столкнулись с почти таким же препятствием или у вас есть угрызения совести, да, я могу использовать это, но я не знаю, что это присоединяйтесь к моему путешествию.

Так что же такое край? В нашем трехмерном мире ребра — это пересечение двух (поверхностей) граней или просто линии, отделяющие поверхности друг от друга. ХОРОШО, но как мы можем идентифицировать их на 2D-изображении.

Здесь вы можете увидеть 3 грани, помеченные как 1,2,3, и синюю линию, обозначающую ребро. И если вы не догадались, это изображение 3D-объекта :). Теперь к вопросу, как мы идентифицируем ребро в изображении? На самом деле это довольно просто. Область резкого изменения интенсивности пикселей (см. область, обозначенную маленькими стрелками на гранях 2 и 3 на изображении) определяет край, а группа пикселей, предоставляющая вам эту информацию, образует края , Ух ты!! это было не так сложно.

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

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

Но сначала вам следует кое-что знать,

Линейная фильтрация – это метод фильтрации, при котором значение выходного пикселя представляет собой линейную комбинацию соседних входных пикселей. это можно сделать с помощью свертки. Например, фильтры среднего/среднего значения или фильтрация по Гауссу.

Нелинейную фильтрацию нельзя выполнить с помощью свертки или умножения Фурье. Скользящий медианный фильтр — это простой пример нелинейного фильтра.

Как работает обнаружение границ? (Нематематическое объяснение)

Сосредоточьтесь на двух прямоугольниках: оранжевом и черном. Черный немного отодвинут от края, а оранжевый выглядит так, будто лежит на краю. Теперь это визуальный результат, но как компьютер идентифицирует край? Это достигается с помощью так называемого ядра (или фильтра), который представляет собой матрицу, свернутую с изображением в режиме скользящего окна, и дает карту признаков. Значения на карте признаков показывают, находится ли определенный пиксель на краю или нет. Например, после применения приведенного выше фильтра, показанного синим цветом (фильтр Превитта — направление X), он дает нам разницу между правыми пикселями (интенсивность) и левыми пикселями (помните определение?), поэтому в случае, когда разница равна считается, что целевой пиксель лежит на краю, например, в нашем случае мы получаем 125 (черный) и 260 (оранжевый), явно оранжевый имеет гораздо более высокое значение, поэтому он лежит на краю.

Методы обнаружения краев

Вот некоторые из масок для обнаружения краев, которые мы обсудим в следующих уроках. Все это линейные фильтры (те, которые используются путем их свертки с заданным изображением, как объяснено в разделе цитат).

  • Оператор Превитта
  • Оператор Собеля
  • Фарид Оператор
  • Оператор Шарра.

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

Но прежде чем закончить, давайте посмотрим, что возвращает ядро ​​Prewitt на примере, который мы использовали.

Спасибо за прочтение, увидимся в Части 2.