dlib: практикум

Выпуск 2

Эта статья является частью цикла, который выходил в «FPS» в 2017 году. Надеемся, что предыдущая часть цикла скоро тоже будут доступна онлайн.

Один из самых востребованных компонентов dlib – это dlib.image, пакет для работы с изображениями. Он содержит реализации нескольких популярных фильтров, включая свертку ядром 3x3. Но если вы хотите написать свой собственный оконный фильтр, то придется вводить много boilerplate-кода, связанного с рассчетом координат пикселей, что не очень элегантно. На помощь приходят двумерные оконные диапазоны, поддержка которых появилась в dlib 0.9.

Использовать их очень просто. Рассмотрим на примере той же свертки:

float[3][3] kernel = [ 
    [1, 1, 1], 
    [1, 1, 1], 
    [1, 1, 1], 
]; 

Теперь, если у вас есть изображение img, то для прохода окном по всему изображению можно использовать функцию windows и foreach с тремя параметрами – window (структура, хранящая текущий диапазон пикселей в окне), x и y (координаты окна):

foreach(window, x, y; img.windows(3, 3)) 
{ 
    // ... 
} 

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

Color4f sum = Color4f(0, 0, 0); 
foreach(ref Color4f pixel, x, y; window) 
    sum += pixel * kernel[y][x]; 

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

outputImage[x, y] = sum / 9.0f;

Copyright © 2008-2021 Тимур Гафаров и соавторы. Доступно по СС BY-NC-SA 3.0.