5.14. Гауссово сглаживание и границы

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

5.14.1. Гауссов фильтр

gaussian() – центрально-взвешенный родственник mean(). Оба вычисляют среднее по окрестности каждого пикселя, но веса гауссова фильтра не однородны: пиксели ближе к центру окрестности учитываются больше, пиксели у края окрестности – меньше, причём веса следуют знакомой колоколообразной кривой, давшей фильтру его имя.

Именно колоколообразное взвешивание делает гауссов фильтр более плавным, чем усреднение по прямоугольнику. Усреднение по среднему может давать заметные артефакты на границах объектов – резкий обрыв весов вносит небольшие кольцевые узоры на резких переходах. Плавно спадающие веса гауссова фильтра избегают этих колец и дают результат, более близкий к тому, как должно выглядеть «размытие». Платой является больший объём вычислений на пиксель, чем у фильтра среднего, но не намного больший – затраты на пиксель всё равно гораздо ниже, чем у билатерального фильтра.

img.gaussian(1)    # 3x3 Gaussian -- a clean light blur
img.gaussian(2)    # 5x5 Gaussian -- stronger smoothing

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

5.14.2. Нерезкое маскирование

Размытая по Гауссу копия изображения – это исходный материал, который техника нерезкой маски использует для классического повышения резкости. Установка unsharp=True у фильтра переключает его из режима «создать размытое изображение» в режим «вычесть размытое изображение из исходного и прибавить разницу обратно к исходному» – эффект в том, что высокочастотные границы усиливаются относительно плавных внутренних областей.

img.gaussian(1, unsharp=True)

Необязательные параметры mul и add масштабируют силу результата нерезкого маскирования; значения по умолчанию (mul=1.0, add=0.0) дают умеренное повышение резкости, не преувеличивающее шум датчика.

5.14.3. Фильтр Лапласа

laplacian() выполняет дискретное приближение второй пространственной производной изображения. Выход велик там, где значения пикселей меняются быстро, и близок к нулю там, где они постоянны или меняются линейно. Естественное прочтение результата – отклик на границы: пиксели, где изображение меняется быстро, светятся, а пиксели в плавных внутренних областях остаются тёмными.

img.laplacian(1)   # 3x3 Laplacian -- edge response

Доступны те же параметры, что и у gaussian. sharpen=True создаёт изображение с повышенной резкостью (лапласиан прибавляется обратно к исходному, а не возвращается сам по себе). mul и add масштабируют отклик.

Практическое применение помимо обнаружения границ – измерение фокуса. Отклик лапласиана, усреднённый по области, даёт грубую меру того, сколько высокочастотного содержимого несёт область; на хорошо сфокусированном кадре это среднее велико, на размытом кадре оно падает. Сравнение отклика лапласиана между кадрами – дешёвый способ спросить «в фокусе ли объектив?», не прибегая к более затратной метрике контраста.

5.14.4. Метод find_edges

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

Метод принимает параметр edge_type, выбирающий между двумя алгоритмами:

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

EDGE_CANNY выполняет детектор границ Канни – классический многоэтапный алгоритм. Он вычисляет градиент яркости, подавляет все немаксимальные отклики вдоль направления градиента (так что каждая граница имеет ширину в один пиксель) и применяет гистерезисный порог (так что граница, сильная в одном месте, прослеживается даже там, где она ослабевает между точками). Результат – чистый, тонкий, связный набор пикселей границ того рода, который нужен любому классическому алгоритму на основе границ.

Параметр threshold – это кортеж из двух элементов (low, high). Для EDGE_CANNY значение high – это порог, выше которого пиксель определённо является границей, а значение low – порог, выше которого пиксель является границей только если он связан с определённой границей. Для EDGE_SIMPLE имеет значение только high; это единственный порог, выше которого пиксель считается границей. Значение по умолчанию (100, 200) – отправная точка, которую стоит подстроить под конкретную сцену.

img.gaussian(1)                                   # pre-smooth
img.find_edges(image.EDGE_CANNY, threshold=(50, 100))

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

5.14.5. Адаптивная пороговая обработка на гауссовом фильтре

Как и статистические фильтры, gaussian() принимает пару ключевых слов threshold=True / offset=N для адаптивной пороговой обработки. Поведение такое же, как и с mean(): гауссова статистика в каждой позиции становится локальной границей, а исходный пиксель сравнивается со статистикой плюс смещение для получения бинарного результата.

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