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;