GIMP: изменение размера изображения сплайнами Акима
Для изменения размеров изображения в GIMP применяются следующие интерполяционные фильтры:
без фильтра (1x1)
линейный (2x2)
кубический (4x4)
без гало (4x4)
мало гало (4x4)
В силу малого размера этих фильтров изменение размера происходит быстро. Последние два медленее, но не из-за самого фильтра, а из-за дополнительной обработки (подавления краевых эффектов). Это достоинство, но и недостаток одновременно. По сути используются простейшие интерполянты 0-ой, 1-ой и 3-ей степени. Эти простейшие интерполянты не обеспечивают непрерывную гладкость, а на определённых данных кубический интерполянт имеет слишком большой изгиб (краевой эффект), не соответствующий изображению.
В то же время есть сплайн Акимы, лишённый недостатков простейших интерполянтов и хорошо отражающий само изображение. Достаточное описание сплайнов Акимы дано в английской вики. А наглядный материал и время выполнения в статье "Интерполяция: рисуем гладкие графики средствами PHP и GD".
Что мы видим из статьи и наглядного материала?
Видим, что свойство у сплайнов Акимы очень подходят к задаче изменения размера изображения. Но есть одно "но"! В своей канонической форме сплайны Акимы требуют расчёта всей таблицы сплайна от начала до конца. Учитывая, что изменение размеров изображения происходит по двум осям (по строкам и столбцам) это становится "проблемой". Эта "проблема" точно не является какой то нерешаемой или что то типа того, а скорее крайне неудобной.
Как же решать эту "проблему"?
Можно действовать "в лоб" и расчитывать по новой таблицу сплайна Акимы для каждого следующего столбца. Но такое сильно ударит по времени выполнения и разница, по сравнению с простыми интерполянтами, будет колоссальной.
Можно использовать промежуточное изображение и сначала изменить размер по одной оси, после чего уже по другой. Но будут небольшие потери на округлении в промежуточном изображении. Потери небольшие, но будут.
А можно повнимательнее присмотреться к формулам сплайна Акимы и увидеть, что для конкретной точки используется всего 4 элемента таблицы сплайна Акимы, которые полностью формируются из 6ти исходных пикселей. "Сложности" возникнут только на крайних пикселях изображения. Но никто не заставляет нас использовать каноническую формулировку сплайна Акимы для крайних пикселей. Можно ведь использовать тот же приём, который используется на простых интерполянтах - расширение изображения клонированием крайних пикселей. При такой "постановке вопроса" двухосный сплайн Акимы превращается в фильтр размером (6x6). Именно так и был построен плагин изменения размеров изображения сплайнами Акима для GIMP: https://github.com/ImageProcessing-ElectronicPublications/gimp-plugin-scaler-biakima


Полное сравнение различных методов изменения размеров изображения в GIMP.
Ссылки по использованию сплайнов Акимы для изменение размеров изображений: