BicubicResize / BilinearResize / BlackmanResize / GaussResize / LanczosResize / Lanczos4Resize / PointResize / Spline16Resize / Spline36Resize / Spline64Resize

Фильтры группы Resize (изменение размеров кадра, масштабирование, ресайз)

BicubicResize (clip, int target_width, int target_height, float "b", float "c", float "src_left", float "src_top", float "src_width", float "src_height")
BilinearResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
BlackmanResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height", int "taps")
GaussResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height", float "p")
LanczosResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height", int "taps")
Lanczos4Resize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
PointResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
Spline16Resize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
Spline36Resize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
Spline64Resize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")

С v2.56 вы можете использовать смещения (как в Crop) для всех этих функций:

GaussResize (clip, int target_width, int target_height, float "src_left", float "src_top", float -"src_right", float -"src_top")

Для всех функций изменения размера можно использовать приведенный расширенный синтаксис, который позволяет обрезать кадр до выполнения собственно изменения размера (масштабирования). Если поставить функцию обрезки Crop до функции Resize, будут выполняться абсолютно те же операции, хотя может быть заметна небольшая разница в скорости их выполнения.

Crop(10,10,200,300).BilinearResize(100,150)
# тоже самое что
BilinearResize(100,150,10,10,200,300)

Это важно: Изменения размеров кадра по горизонтали и вертикали - это 2 отдельные независимые друг от друга операции. Если входной размер по одной из координатных осей такой же как и выходной, то соответственно операция по изменению размера по этой оси пропустится.
Какая операция, горизонтальная или вертикальная, будет вызываться первой, определяется наименьшей пропорцией по уменьшению кадра. Это сделано для того, чтобы сохранить максимальное качество картинки. Таким образом на вход 2-й операции по изменению размера кадра подается картинка наилучшего качества.

BilinearResize

Фильтр BilinearResize перемасштабирует входной видео кадр к произвольному новому разрешению. Если добавить дополнительные параметры source, то результат будет такой же как, если поставить Crop с этими же пареметрами до BilinearResize (только чуть быстрее).

BilinearResize использует стандартный билинейный фильтр и почти тождественен опции программы VirtualDub для изменения размера кадра "точное билинейное" ("precise bilinear"). Слово "почти" используется потому, что в VirtualDub этот фильтр не совсем правильно масштабирует картинку. А именно так, что пиксели вверху и справа либо повторяются либо обрезаются. (Это заметно только, если кадр увеличить в 2 или более раз. Иначе это настолько незаметно, что об этом даже не стоит упоминать). Отметим, однако, что Avery Lee утверждает, что смотря на код и сравнивая результаты, VirtualDub 1.6 и AviSynth 2.5 генерируют одинаковые отображения.

Примеры:
# Загрузить видео файл и изменить размер на 240x180 (из любого предыдущего размера)
AVISource("video.avi").BilinearResize(240,180)

# Загрузить 720x480 (CCIR601) видео и изменить его на 352x240 (VCD),
# при этом сохраняя соотношения размеров сторон исходника
AVISource("dv.avi").BilinearResize(352,240,8,0,704,480)

# или что то же самое
AviSource("dv.avi").BilinearResize(352, 240, 8, 0, -8, -0)

# Вырезать квадрант из право-верхнего угла видео 320x240 и зумировать его так,
# чтобы он заполнил весь кадр
BilinearResize(320,240,160,0,160,120)

BicubicResize

BicubicResize похож на BilinearResize, за исключением того, что вместо линейного используется двухпараметрический кубический фильтр Митчела-Нетравали (Mitchell-Netravali two-part cubic).
Параметры b и c используются, чтобы править свойства кубического фильтра, они иногда соотносятся с терминами размытие (blurring) и осцилляции (волны, звон, ringing) соответственно.

Если b = 0 и c = 0.75, то фильтр ведет себя также как и фильтр "точный бикубический" ("precise bicubic") из VirtualDub за исключением тех же самых проблем VirtualDub, которые были упомянуты выше. По умолчанию b = 1/3 и c = 1/3. Эти значения рекомендовали Митчел и Нетравали, так как они дают наиболее субъективно приемлемые результаты. Более высокие значения дают интересные поп-арт эффекты. Попробуйте, например, значения b = 0 и c = -5.

Увеличивая размер видео, вы достигните лучших результатов с BicubicResize чем с BilinearResize. Если же Вы уменьшаете видео, результат использования BilinearResize может быть также хорош, если даже не лучше. Не смотря на то, что бикубический фильтр VirtualDub даёт лучшие результаты чем его же билинейный фильтр, надо отметить, что это происходит не потому, что бикубический фильтр выполняет преобразование качественнее, а потому, что он увеличивает резкость. На резкие картинки приятно любоваться до тех пор пока их не сжимают. Как только их начинают сжимать, на них уже противно смотреть. BicubicResize по умолчанию делает картинку не резче, чем его побратим из VirtualDub-а, но резче чем BilinearResize. Если планируется закодировать видео с низкой скоростью потока (bitrate), то будет не удивительно, если BilinearResize даст лучший конечный результат.

Для достижения математически точной и правильной работы фильтра нужно установить такие b и c, которые удовлетворяют соотношению:

b + 2 * c = 1
Тогда получаем максимальное значение c = 0.5, когда b = 0 , что представляет из себя метод криволинейной интерполяции - сплайн Катмула-Рома (Catmull-Rom spline). Что является хорошим предложением для резкости.

Начиная с c>0.6 то фильтр начинает "звенеть" ("ring"). Это не настоящая резкость, а подчеркивание контуров (crispening), как при регулировке резкости в телевизоре.
Отрицательные значения недопустимы для b, используйте b = 0 для величин c > 0.5.

BlackmanResize

BlackmanResize является модификацией LanczosResize которая имеет лучший контроль волновых артефактов для большого количества точек интерполяции (taps). Смотрите LanczosResize для объяснения аргумента taps (по умолчанию: taps=4). (добавлено в v2.58)

GaussResize

Использует для изменения размеров кривые Гаусса, имеет регулируемый параметр резкости 'p' (по умолчанию 30). p может изменяться от 1 до 100, где 1 дает слишком размытую картинку, тогда как 100 - очень резкую. GaussResize использует 4 опорные точки, и по скорости примерно такой же, что и Lanczos4Resize. (добавлен в версии 2.56)

LanczosResize / Lanczos4Resize

LanczosResize (предложил Ланкзос) - это альтернатива BicubicResize с большим значением параметра c, около 0.6 ... 0.75, которое дает достаточно сильную резкость.
Это обычно даёт лучшее качество (меньше побочных эффектов) и резкую картинку.

Lanczos4Resize (добавлен с версии 2.55) тесно связан с LanczosResize (правильное имя которого должно было бы быть Lanczos3Resize). Последний использует 2*3=6 долей (lobes), а первый 2*4=8 долей для изменения размера кадра. В результате Lanczos4Resize дает более резкую картинку. Особенно хорошо применять его для увеличения клипа.

Lanczos4Resize - это короткое имя функции LanczosResize(taps=4).

Замечание: входной аргумент названный taps должен реально быть lobes (в действительности это половина числа lobes). При обсуждении ресайзеров, taps имеет другой смысл, как описывается ниже.

Количество опорных точек интерполяции (параметр taps)

Пусть Taps=4. "Для повышения разрешения отсчетов (upsampling) (увеличения изображения), размер фильтра подбирается так, что его уравнение охватывает (falls across) 4 входных отсчета, делая его фильтром с 4-мя опорными точками (отводами, taps). Эти 4 опорные точки остаются независимо от размера получающегося выходного кадра. Для понижения разрешения отсчетов (downsampling) (уменьшения изображения), фильтр подбирается так, что его уравнение охватывает 4 *выходных* отсчета, которые, естественно, расположены дальше друг от друга, чем входные. Итак, при понижении разрешения отсчетов вдвое (изменении размера на вдвое меньший), фильтр покроет 2*4=8 входящих отсчета, соответственно используя 8 опорных точек. Для 3-х кратного уменьшения понадобится 3*4=12 опорных точек, и т.д.

Таким образом, общее количество опорных точек (taps), необходимое при понижении разрешения отсчетов (уменьшении), равно коэффициенту уменьшения, умноженному на количество долей (lobes) (например, при уменьшении в T раз и применении LanczoskResize количество опорных точек равно T*2*k). И фактически это значение следует округлить до следующего четного целого. При увеличении разрешения всегда будет k опорные точки." Источник: [avsforum post].

Lanczos4Resize - это короткое обозначение для LanczosResize(taps=4).

PointResize

PointResize самый простой из возможных фильтров для изменения размеров. Он использует выборку (отсчеты) по точкам (Point Sampler), иначе называемую алгоритмом ближайшего соседа (Nearest Neighbour), что обычно дает картинку с сильно выраженными квадратиками (блоками). Обычно этот фильтр можно использовать только тогда, когда Вы намерены получить картинку с заведомо худшим качеством, или, если необходимы четкие пикселизированные рисунки (clear pixel drawings).
Очень удобен для увеличения маленьких площадей для их внимательного анализа.

Spline16Resize/Spline36Resize/Spline64Resize

Три основанных на сплайнах ресайзера (добавлены в v2.56/v2.58). Целесообразность сплайнов - быть резкими насколько возможно с меньшими волновыми артефактами чем производит LanczosResize. Spline16Resize использует sqrt(16)=4 опорные точки, Spline36Resize использует 6 опорных точек, и т.д. ... Чем больше опорных точек использовано, тем резче будет ваш клип. Сравнение некоторых ресайзеров приведено там.

На сегодня, авторы AviSynth не знают, как получены коэффициенты сплайновых ресайзеров. Если вы в курсе, пожалуйста дайте нам знать.

Изменения:

v2.55 добавлен Lanczos4Resize
v2.56 добавлены Spline16Resize, Spline36Resize, GaussResize и параметр taps в LanczosResize; добавлены смещения в Crop части xxxResize
v2.58 добавлены BlackmanResize, Spline64Resize

$English Date: 2008/06/22 17:53:40 $
Русский перевод 27.05.2005 venometal
совместно с Turyst04 Turyst04@nextmail.ru
Отредактирован и обновлен 28.08.2005-22.06.2008 Fizick