четверг, 4 октября 2012 г.

Передискретизация в dlib.image

Передискретизация (ресэмплинг) изображения - это всего-навсего изменение его разрешения в пикселях. Такую функцию должна включать любая уважающая себя библиотека обработки изображений, и с сегодняшнего дня dlib - не исключение. В пакете dlib.image.resampling доступны четыре алгоритма ресэмплинга, которые часто встречаются в графических редакторах: линейная интерполяция (Linear или Nearest Neighbor), билинейная (Bilinear), бикубическая (Bicubic) и фильтр Ланцоша (Lanczos). Ниже представлены результаты их работы на примере увеличения разрешения картинки с 64х64 до 256х256.

Оригинал







Linear
Самый простой и, следовательно, самый быстрый способ изменить размеры изображения. Известен также как интерполяция методом ближайшего соседа (Nearest Neighbor). Для промежуточных пикселей выбирается ближайшее известное значение.



Bilinear
Для получения промежуточного значения производится линейная интерполяция между четырьмя ближайшими пикселями. Это позволяет несколько сгладить переходы. Билинейный фильтр - неплохой компромисс между скоростью и качеством результата.


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


Lanczos
У бикубической интерполяции есть недостаток - изображение получается несколько размытым. Чтобы сохранить четкость, можно воспользоваться фильтром Ланцоша. Он немного увеличивает пикселизацию, но создает контрастные области вдоль контуров для повышения четкости. В моей реализации я использовал ядро 7х7. Очень медленно, зато качественно.


Существуют и другие алгоритмы - постепенно они тоже будут добавлены в библиотеку.
Изменения доступны в dlib ревизии r5 и выше.

Комментариев нет:

Отправить комментарий