В этой статье представлена реализация на Python алгоритма распознавания источников освещения на картах окружения (LDR или HDR) при помощи равнопромежуточной проекции (equirectangular projection). Однако после внесения незначительных изменений её также можно использовать с простыми фоновыми изображениями или кубическими картами. Примеры возможного применения алгоритма: программы трассировки лучей, в которых требуется распознавать первичные источники освещения для испускания из них лучей; в растеризованных рендерерах он может применяться для отбрасывания теней, использующих карту окружения; кроме того, алгоритм также можно применять в программах устранения засветов, например в AR.
Алгоритм состоит из следующих этапов:
- Снижение разрешения исходного изображения, например, до 1024.
- Преобразование изображения в яркость (luminance), при необходимости с размытием изображения.
- Применение метода квази-Монте-Карло.
- Преобразование из сферических координат в равнопромежуточные.
- Фильтрация сэмплов на основании яркости соседа.
- Сортировка сэмплов на основании их яркости.
- Фильтрация сэмплов на основании евклидовой метрики.
- Слияние сэмплов при помощи алгоритма Брезенхэма.
- Вычисление позиции кластера освещения на основании его яркости.
Существует множество алгоритмов снижения разрешения изображений. Билинейная фильтрация — самый быстрый или простой в реализации, к тому же он лучше всего подходит в большинстве случаев. Для преобразования яркости и в LDR-, и HDR-изображениях можно использовать стандартную формулу:
lum = img[:, :, 0] * 0.2126 + img[:, :, 1] * 0.7152 + img[:, :, 2] * 0.0722
Дополнительно можно применить к изображению яркости небольшое размытие, например, в 1-2 пикселя для изображения разрешением 1024, для устранения всех высокочастотных деталей (в частности, вызванных снижением разрешения).
Читать полностью »