Механикус С.


Название статьи: Об алгоритмах масштабирования. BDSizer.
Источник: http://mechanicuss.livejournal.com/82978.html


Текст статьи

Началось с того, что снимал один из сюжетов для журнала. В фотоаппарате забыл переключить значение ISO, и фото получилось шумноватым. Причем в фотошопе, будучи смасштабированным до 25%, выглядело нормально. А в любимой смотрилке FastStone Image Viewer при таких же раскладах, шум существенно портил картинку.

Задумалсо об алгоритмах масштабирования изображений. В фотошопе (CS2) применяются пять алгоритмов: Nearest Neighbor, Bilinear, Bicubic, а также Bicubic Smoother и Bicubic Sharper (по умолчанию используется Bicubic). Нашел в смотрилке включение режима качественного масштабирования (по умолчанию он выключен, т.к. качественное масштабирование занимает больше времени) - здесь алгоритмов было три: Fast Linear, Linear и некий таинственный Lanczos3.

И если обо всех перечисленных перечисленных алгоритмах кроме последнего я имел хоть какое-то представление, то о Lanczos3 услыхал впервые. Поисковики навскидку ничего о нем не выдали (именно о математике) - надо будет поискать тщательнее. Но включение качественного масштабирования с упомянутым алгоритмом весьма порадовало! Картинка была очень качественной.

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

В итоге была найдена не менее чудодейственная утилитка - BDSizer. Что примечательно - как и множество других фриварных инструментов - не требующая инсталляции, довольно легкая (1.68Mb) и очень юзабельная.

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

Впечатляет? :)

В фотошопе применялся для уменьшения алгоритм Bicubic. Отмечу что при смене его на Bicubic Sharper результаты были чуть лучше - но до BDSizer никоим образом недотягивали.

И в заключении краткая инструкция по пользованию BDSizer, найденная на одном из форумов:

1. После окончания работы с фото в ФШ(предварительно сохранив оригинал в необходимом вам формате), перевести в 8 Бит, конвертировать в sRGB, сохранить в JPEG с качеством 10 (предварительно фото не сжимать!!! и настоятельно НЕ рекомендую шарпить!!!).

2. Открыть BDSizer, загрузить сохраненный в JPEG снимок и задать следующие параметры: размер (имеется в виду размер по длиной стороне) какой хотите, обычно 700-800 для горизонтальных и 600-650 для вертикальных, алгоритм сжатия LANCZOS3 !!!!!!!! только этот, ДРУГИЕ НЕ ИСПОЛЬЗОВАТЬ!!!, поставить галочку напротив резкости если надо! После этого жмете кнопку RECIZE IMAGE и контролируете полученный результат в окне предпросмотра.

3. Выставляете желаемый вес изображения в Кб (обычно от 100 до 150 в зависимости от сайта) и жмете кнопку СОХРАНИТЬ, после чего появляется окно сохранения, где вы указываете имя файла и место сохранения.

Все! На этом работа закончена. Больше никакие функции этой проги я не использую. Качество сжатия - намного лучше, чем все, до сиих пор мне известное ПО делало.

Upd: нашел информацию о математике Lanczos3. Для справки привожу текст и по остальним алгоритмам:

"Nearest neighbor". Быстрейший и худший метод, поскольку используется попросту значение бижайшей точки исходной картинки. По сути, часть точек отбрасывается (при уменьшении) либо дуплицируется (при увеличении).
"Bilinear". В обоих направлениях проводится линейная интерполяция (используется 2х2 матрица, то есть 4 ближайших точки). Быстрый и неплохой метод, слегка сглаживающий картинку, однако при больших увеличениях начинает проявляться блочная структура.
"Bicubuc". В обоих направлениях проводится кубическая интерполяция (по матрице 4х4, то есть используется 16 ближайших точек), дает более резкую картинку. При увеличении дает значительно лучший результат, чем билинейный метод. Поскольку детали прорисовываются четче, усиливаются и шумы, то есть картинки с шумами нужно увеличивать очень осторожно. Значительно медленнее, чем билинейный фильтр.
"Precise bilinear". В обоих направлениях проводится линейная интерполяция, но вместо 2х2 используется полная билинейная матрица. При увеличении работает аналогично билинейному методу, но при уменьшении очень эффективно сглаживает шумы.
"Precise bicubuc". В обоих направлениях проводится кубическая интерполяция по полному бикубическому ядру. Очень хорош как при увеличении так и при уменьшении картинки. Медленнее всех предыдущих. Имеется выбор между тремя значениями одного из параметров (но на глаз разницу не видно). A=-1.00 дает наиболее четкую картинку.
"Lanczos3". Используется матрица 6х6 (то есть каждая точка вычисляется по 36 соседним точкам. Многие считают этот метод лучшим, но он и самый медленный.

Мое замечание по скорости работы: уменьшение фото - это не монтаж видео, и здесь разница в скорости работы совершенно не принципиальна. Скажем на моем компьютере уменьшеншение картинки в фотошопе на глаз заняло около 0.5с, а в BDSizer - около 1с.

Ссылки по теме:
1. Дорогая, я уменьшил число пикселов в изображении - об алгоритмах уменьшения фото.
2. Увеличиваем число пикселов в изображении - сравнение различных реализаций функции Resample.