Как воссоздать математику за кривыми фотошопа

По сути, я хочу понять, как рассчитать значения вдоль "кривой", как показано здесь в окне кривых фотошопа:

Кривые фотошопа

Итак, учитывая N точек с x между 0 и 1 и y между 0 и 1 - мы создадим кривую, которая проходит через все эти точки. Учитывая эту кривую, я хотел бы иметь возможность рассчитать все значения кривой для любого данного X.

Другими словами, я хотел бы изменить значения цвета так же, как это делает окно кривых, но программно.

Я читал, что это "сплайны Кэтмулла" - но все, что я вижу, - это функция, которая опирается на параметрический T - я хочу иметь возможность искать значения x. Я хотел бы сделать это в C, если это возможно

5 ответов

Решение

Сплайн Catmull-Rom используется, потому что это своего рода сплайн, представляющий кривую, в которой вы можете добавить контрольные точки и уточнить саму кривую (это то, что вы делаете в Photoshop, когда нажимаете, чтобы добавить новую точку), с особенностью чтобы кривая проходила через каждую контрольную точку, которую вы указали.

В любом случае вам просто нужна функция, которая принимает значение (с плавающей запятой в 0..1 или int в 0..255 или в любом другом цветовом пространстве), которое будет производить другое.

float fun(float x) {
  y = /* something */
  return y;
}

Это может быть сделано с любой функцией, конечно. Самым базовым по умолчанию является функция тождества

float fun(float x) {
  y = x;
  return y;
}

Любая другая функция может быть рассчитана с помощью кривых, и она будет в порядке, но более сложной для разработки, я бы посоветовал вам начать с простых примеров, таких как кривая Безье. В любом случае t Параметр используется потому, что это параметрические кривые, вам нужно понять некоторые математические основы кривых, прежде чем углубляться в разработку, посмотрите здесь.

Этот код точно соответствует кривым в Photoshop (не мой код): http://www.developpez.net/forums/d331608-3/autres-langages/algorithmes/contribuez/image-interpolation-spline-cubique/

Вот ссылка на VBScript, который, по-видимому, реализует кривые кубического сплайна, которые использует фотошоп.

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=68577&lngWId=-1

Я не знаком с CR, но если он похож на Безье, то параметр T изменяется от 0 в одной конечной точке сечения кривой до одного в другой конечной точке. Это то, как вы "шагаете" по кривой. Таким образом, вы не можете просто вставить свое значение x. Вы можете либо сэмплировать длинную через некоторый произвольный интервал, либо использовать какой-то алгоритм поиска цели, чтобы приблизиться к данному значению x с любой точностью, которую вы считаете необходимой.

Другие вопросы по тегам