Image

Обнаружение признаков, часть 2: операторы Лапласа и Гаусса

Лаплас встречает Гаусса — история двух операторов в области обнаружения границ

Делиться

1e104db2cf55281946975dc611047f4d

Введение

Обнаружение признаков — это область компьютерного зрения, ориентированная на использование инструментов для обнаружения интересующих областей на изображениях. Важной особенностью большинства алгоритмов обнаружения признаков является то, что они не используют машинное обучение, что делает результаты более интерпретируемыми, а в некоторых случаях и более быстрыми.

В предыдущей статье этой серии мы узнали о краях — зонах резкого изменения интенсивности изображения. Края обычно представляют собой локальные зоны, где можно обнаружить интересующий объект.

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

126ec7061f9ddc656581af34f355ecf0

Другими словами, мы можем обнаружить края, взяв минимальные/максимальные пики первой производной функции интенсивности , что представлено изображением в середине.

Вторая производная изображения

Вернёмся к упомянутому примеру и спросим себя, что произойдёт, если взять вторую производную? Ответ показан на правом графике ниже. В этом случае минимальные/максимальные пики первой производной будут соответствовать нулям второй производной.

58cb1552282eef2c74a72bff6d75453c

Это означает, что теперь мы можем использовать нулевые значения второй производной в качестве дополнительного критерия для выделения границ. Однако важно соблюдать осторожность, поскольку другие точки на изображении также могут приводить к тому, что вторая производная равна нулю, но при этом не являться границами. Для этого рекомендуется использовать другие фильтры, чтобы исключить такие случаи.

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

Определение

Лапласиан формально определяется следующей формулой:

456d1ce3d400c490727e7e18c5348fe1

Как мы видим, Лапласиан — это просто сумма вторых производных по направлениям x и y.

Лапласиан не предоставляет информацию о направлении ребра.

Дискретное приближение

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

Для этого предположим, что для части изображения ниже мы хотим вычислить лапласиан для пикселя I₂₂. Вычислим производную по оси X.

b32cb5cf9cba64f54cfac5182bcc362a

Для этого мы дважды используем формулу производной из предыдущей статьи, выбрав два значения для Δx: -1 и 1. Получаем:

  • Для Δx = -1: dI / dx = I₂₃ – I₂₂
  • Для Δx = 1: dI / dx = I₂₂ – I₂₁

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

Следовательно, мы можем взять две только что вычисленные нами разности и найти их разность. Более формально, это было бы то же самое, если бы мы применили стандартную формулу производной, приравняв Δx к -1. Получаем:

  • d2I / dx = (I₂₃ – I₂₂) – (I₂₂ – I₂₁) = I₂₃ – 2I₂₂ + I₂₁

Отлично! Мы вычислили вторую производную по оси X. Аналогичную процедуру можно выполнить для второй производной по оси Y. Получим следующее выражение:

  • d2I / dy = (I₃₂ – I₂₂) – (I₂₂ – I₁₂) = I₃₂ – 2I₂₂ + I₁₂

Наконец, осталось только сложить обе производные. Получаем:

  • d2I / dx + d2I / dy = I₁₂ + I₂₁ + I₂₃ + I₃₂ – 4I₂₂

Весь процесс вычисления Лапласа можно визуализировать с помощью диаграммы ниже:

1983b62b524d668e24825356858c61bd

На основе полученного результата мы также можем построить свёрточное ядро 3×3 для Лапласа:

5630f85480fc51d87d5726d0a8939ec3

Интересно, что сумма элементов этого ядра равна 0, что означает, что если входное изображение постоянно, то применение фильтра даст матрицу с нулевыми элементами. Это логичный результат, поскольку интенсивность не меняется.

В отличие от ядер Собеля и Шарра, ядро Лапласа обнаруживает изменения интенсивности в обоих направлениях . Достаточно применить ядро 3×3 к любому изображению, и оператор Лапласа выдаст конечные скалярные значения, представляющие изменения интенсивности.

Напомним, что при использовании операторов Собеля и Шарра ядра применялись по отдельности к осям X и Y, а затем рассчитывались их величины.

Обнаружение диагонального края

Мы вывели ядро, представляющее собой сумму вторых производных по осям X и Y. Следовательно, этот метод хорошо подходит для обнаружения как горизонтальных, так и вертикальных рёбер. Но что, если рёбро на изображении имеет диагональное направление? Мы это пока не учитывали.

По этой причине представленное выше ядро обычно слегка корректируется с учётом диагонального направления. Один из наиболее распространённых вариантов — использовать следующее ядро:

3e83c8fa79e13ce795fa256b17b2a0bf

Изотропия

Мы видим, что матрица Лапласа симметрична, что делает её изотропной. Изотропия — это свойство, согласно которому ядро инвариантно к вращению, то есть результат применения изотропного фильтра к изображению и его повёрнутой версии одинаков.

Шум

Ядро Лапласа, которое мы рассматривали выше, хорошо подходит для обнаружения границ. Однако мы не учли другой аспект, который мог бы помешать нам эффективно применять этот фильтр в реальной жизни: шум .

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

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

70f3ad69cc229f4a6638e36b0fb2a551

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

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

Фильтр Гаусса

Фильтр Гаусса — это метод подавления шума в изображении, позволяющий применять лапласиан или другой оператор обнаружения границ без ограничений.

Формально гауссово распределение задается следующей формулой (где μ = 0):

7fb1a3472e1aca6975ebf284cd97d534

Функция Гаусса g(x) отображена ниже на верхнем правом графике:

7ee08c29cf0a9153ce2130b3c0ea92f7

Умножение функции интенсивности I(x) на гауссову функцию g(x) приводит к сглаживанию интенсивности в целом, что упрощает анализ. Пример показан на диаграмме слева внизу.

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

Производная гауссовой функции

Мы можем заметить, что взятие первой производной изображения является линейной операцией, поэтому мы можем разложить наши вычисления следующим образом:

21c7f5378d31aba7973265dc12f33e3f

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

Лапласиан Гаусса

Мы можем применить тот же приём ко второй производной, о котором мы говорили в начале статьи, для обнаружения границ. В результате мы можем заранее вычислить вторую производную гауссовой функции, а затем умножить её на функцию интенсивности. Результат показан на нижнем правом графике:

437bf089f62bd1ce8da4b545780e67a3

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

Вторую производную гауссовой функции (нижнее левое изображение) часто называют перевернутым «мексиканским сомбреро» из-за ее большого сходства по форме со шляпой сомбреро.

OpenCV

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

Лапласиан Гаусса

Для начала импортируем необходимые библиотеки и загрузим входное изображение:

импорт cv2 импорт numpy как np импорт matplotlib.pyplot как plt

Мы будем использовать пример изображения, содержащего несколько монет:

15fab542924f7fe605bab581eec2d0b5

Давайте прочитаем изображение:

изображение = cv2.imread('data/input/coins.png') изображение = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Мы преобразовали входное изображение в формат grasycale, чтобы иметь возможность в дальнейшем брать производные относительно изменений интенсивности.

Как обсуждалось выше, перед использованием оператора Лапласа мы применим гауссовский фильтр:

изображение = cv2.GaussianBlur(изображение, (7, 7), 0)

  • Второй параметр (7, 7) относится к размеру ядра.
  • Третий параметр используется для определения значения стандартного отклонения σ из формулы Гаусса, приведённой выше. Здесь мы устанавливаем его равным 0, что означает, что стандартное отклонение σ будет выбрано OpenCV автоматически на основе предоставленного размера ядра.

Теперь мы готовы применить фильтр Лапласа:

laplacian_signed = cv2.Laplacian(image, cv2.CV_16S, ksize=3)

Здесь мы указываем тип выходных данных как cv2.CV_16S, что эквивалентно типу short, со значениями в диапазоне [-32768, 32767]. Мы делаем это, поскольку фильтр Лапласа может выдавать значения, выходящие за пределы стандартного пиксельного интервала [0, 255]. Если бы мы этого не сделали, выходные значения были бы ограничены диапазоном [0, 255], и мы бы потеряли информацию.

OpenCV также предоставляет полезную функцию для сопоставления необработанного вывода Лапласа (или любых других результирующих значений) со стандартным диапазоном [0, 255]:

laplacian_absolute = cv2.convertScaleAbs(laplacian_signed)

Результирующая переменная laplacian_absolute имеет ту же форму, что и laplacian_signed , но значения ограничены диапазоном [0, 255]. Преобразование выполняется с помощью функции cv2.convertScaleAbs() таким образом, чтобы сохранить информацию о пересечениях нуля:

  • Значения, абсолютное значение которых больше 255, ограничиваются 255.
  • Для значений от -255 до 255 берется абсолютное значение.
ea031f0dab4f140f43c0227c5b799acd

Обнаружение пересечения нуля

К сожалению, в документации OpenCV представлен только пример применения лапласиана, но не показано, как использовать его результаты для обнаружения пересечения нулевого уровня. Ниже приведён простой фрагмент кода, реализующий это:

laplacian_sign = np.sign(laplacian_signed) zero_crossings = np.zeros_like(laplacian_sign, dtype=bool) для сдвига в [-5, 5]: zero_crossings |= (np.roll(laplacian_sign, shift, axis=0) * laplacian_sign < 0) zero_crossings |= (np.roll(laplacian_sign, shift, axis=1) * laplacian_sign < 0) threshold = 20 edges = np.uint8(zero_crossings & (np.abs(laplacian_signed) > threshold)) * 255

Проще говоря, мы создаём переменную zero_crossings , которая содержит информацию о том, является ли пиксель в позиции (x, y) кандидатом на нулевое пересечение. В нашем коде мы считаем пиксель кандидатом на нулевое пересечение, если его знак (+ или -) отличается от знака любого сдвинутого пикселя на пять позиций по горизонтали или вертикали.

Мы могли бы выбрать другую константу сдвига (не обязательно 5) или даже объединить несколько из них и/или также учесть диагональные сдвиги.

Чтобы исключить нерелевантные нулевые пересечения, мы оставляем только те, абсолютное значение лапласиана которых превышает определенный порог (20).

Визуализация

Наконец, давайте составим график изображений, полученных в ходе нашего анализа:

plt.figure(figsize=(12, 4)) plt.subplot(1, 3, 1) im1 = plt.imshow(laplacian_signed, cmap='gray', vmin=laplacian_signed.min(), vmax=laplacian_signed.max()) plt.title(«Лапласиан (знаковый)») plt.axis('off') plt.colorbar(im1, fraction=0.05, pad=0.05, label='Значение пикселя') plt.subplot(1, 3, 2) im2 = plt.imshow(laplacian_absolute, cmap='gray', vmin=laplacian_absolute.min(), vmax=laplacian_absolute.max()) plt.title(«Лапласиан (абсолютный)») plt.axis('off') plt.colorbar(im2, дробь=0.05, площадку=0.05, метку='Значение пикселя') plt.subplot(1, 3, 3) im2 = plt.imshow(edges, cmap='gray', vmin=edges.min(), vmax=edges.max()) plt.title(«Ребра от нулевых пересечений») plt.axis('off') plt.colorbar(im2, дробь=0.05, площадку=0.05, метку='Значение пикселя') plt.tight_layout() plt.show()

Вот какой результат мы получаем на выходе:

5181afe7c6d54cfd34c69c9c9e68fd27

Как видите, мы успешно обнаружили контуры на правом бинарном изображении. Следующим шагом может быть, например, применение метода OpenCV cv2.findContours() для обнаружения контуров и их дальнейшего анализа.

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

Заключение

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

Ресурсы

  • Градиенты изображений | OpenCV
  • Оператор Лапласа | OpenCV
  • Дискретный оператор Лапласа | Википедия
  • Нормальное распределение | Википедия

Все изображения, если не указано иное, принадлежат автору.

Источник: towardsdatascience.com

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

ИИ почти всех обгонит? Прогнозы звучат громко, но есть нюансы…
Компания Anthropic получила от Amazon 5 миллиардов долларов и в обмен пообещала инвестировать 100 миллиардов долларов в облачные сервисы.
dummy-img
Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.
Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.
dummy-img
dummy-img
Взаимодействие человека и машины погружается под воду.
Взаимодействие человека и машины погружается под воду.
Image Not Found
Компания Anthropic получила от Amazon 5 миллиардов долларов и в обмен пообещала инвестировать 100 миллиардов долларов в облачные сервисы.

Компания Anthropic получила от Amazon 5 миллиардов долларов и в обмен пообещала инвестировать 100 миллиардов долларов в облачные сервисы.

Вкратце Опубликовано: Изображение предоставлено: Thos Robinson/Getty Images для The New York Times (откроется в новом окне) Джули Борт Компания Anthropic получила от Amazon 5 миллиардов долларов и в обмен пообещала инвестировать 100 миллиардов долларов в облачные сервисы.…

Апр 21, 2026
dummy-img

Как почистить виниловые пластинки (2026): пылесос, ультразвук, чистящий раствор, щетка.

Эти щелчки и треск недопустимы. Приведите свою музыку в порядок с помощью этого удобного руководства. Источник: www.wired.com

Апр 21, 2026
Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.

Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.

Это сегодняшний выпуск The Download, нашей ежедневной новостной рассылки, которая предоставляет вам ежедневную порцию событий в мире технологий. Кибермошенники обходят системы безопасности банков с помощью незаконных инструментов, продаваемых в Telegram. В центре по отмыванию денег в Камбодже…

Апр 21, 2026
Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.

Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.

Это сегодняшний выпуск The Download, нашей ежедневной новостной рассылки, которая предоставляет вам ежедневную порцию событий в мире технологий. Кибермошенники обходят системы безопасности банков с помощью незаконных инструментов, продаваемых в Telegram. В центре по отмыванию денег в Камбодже…

Апр 21, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых