GIMP: нелинейное масштабирование изображения

В GIMP я хочу иметь возможность масштабировать изображение нелинейно по горизонтальной оси. Инструменты перспективы и отображения не подходят для этого, потому что они изменяют изображение по вертикали для перспективы. Изображение ниже иллюстрирует то, что мне нужно. Буду признателен за любое руководство!введите описание изображения здесь

Добро пожаловать на GD.SE, Дэвид! Может ли этот вопрос помочь вам?

Ответы (2)

В базовой конфигурации GIMP есть фильтр Distort > Spherize. В горизонтальном режиме он искажает ваше изображение, как будто оно использовалось в качестве этикетки для бутылки. Это определенно нелинейно, но у вас есть лишь небольшой контроль. Пользовательское математическое преобразование было бы лучше. Это обсуждается в конце этого ответа.

К сожалению, самая разреженная область находится посередине, а не на правом краю. Но вы можете временно вставить в свой холст пустую правую половину.

Не забудьте установить размер слоя так, чтобы он покрывал весь холст. В GIMP слои настолько велики, насколько они содержат контент, если не установлен размер слоя.

Произвольные нелинейные выражения могут быть применены, например. с пакетом фильтров G'MIC. Он имеет в части "Деформации" фильтр Декартово преобразование.

Пример; исходное изображение:

введите описание изображения здесь

Диалог фильтра:

введите описание изображения здесь

Вы пишете формулы для координат точки на исходном изображении, откуда берется содержимое, до точки результата (x, y). Формулы, вероятно, являются математическими выражениями языка Python (не уверен). Параметры w и h доступны для ширины и высоты изображения в пикселях. Вам нужно, чтобы они совпадали по краям.

Чтобы получить что-то похожее на ваш собственный рисунок, вы можете написать для x выражение w*f(x/w), где f=любая функция, которая находится между 0 и 1 и имеет следующие свойства

  1. f(0)=0 и f(1)=1
  2. непрерывный, монотонно растет
  3. его производная монотонно убывает.

пример с этой идеей:

формула для x: w*(1-exp(-x/w))/(1-exp(-1))

формула для у: у

оригинал:

введите описание изображения здесь

результат:

введите описание изображения здесь

Вы упомянули, что пробовали перспективную сетку, которая, к сожалению, масштабировала как x, так и y. Следующая x-формула дает все возможные справа налево масштабы вида одномерной перспективной сетки с разными значениями параметра A. Он должен быть положительным числом, большим нуля

формула для X: w * (A+1) * X/(A * W + X)

формула Y: Y

слишком маленький A, скажем, A=0,1, делает результат слишком плотным для растрового изображения слева, а слишком большой A, скажем, A=3, делает эффект бесполезно мягким. Предыдущее изображение лабиринта масштабируется с A=1:

введите описание изображения здесь

У меня установлен G'MIC в Krita, но он также доступен для GIMP и Paint.NET.

Трудно сказать, на каком они языке, так как он выглядит одинаково в c, java, javascript, rust, c#, python и в большинстве функциональных калькуляторов. Математические выражения — это просто математика.
Искажение -> Сферизация было именно тем, что я искал, вертикальное вместо горизонтального в моем случае, но это просто выбираемая опция. Спасибо!

Такие преобразования математически трудно определить. Если ваше преобразование представляет собой закон синуса/косинуса, вы можете использовать фильтры, которые проецируют ваш слой на цилиндр (Фильтры > Карта > Сопоставить объект и сопоставить с цилиндром).

Для произвольного преобразования, возможно, с использованием карты смещения , но реальную карту может быть трудно придумать:

введите описание изображения здесь

Чтобы создать карту смещения (#2):

  • Создайте черно-белый градиент на изображении
  • Используйте кривые, чтобы изменить его на градиент от серого к белому и к серому (простой двусторонний градиент не работает)

введите описание изображения здесь

С другой стороны, если вы просто хотите создать сетку, то вместо сжатия обычной сетки вы можете создать путь, скрипт ofn-path-inbetweenerсоздаст промежуточные пути между двумя путями по закону квадрата или косинуса. Побочным эффектом является то, что полосы имеют одинаковую ширину:

введите описание изображения здесь