Как воссоздать математику за кривыми фотошопа - PullRequest
12 голосов
/ 05 декабря 2010

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

Photoshop Curves

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

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

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

Ответы [ 5 ]

7 голосов
/ 06 апреля 2011

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

3 голосов
/ 05 декабря 2010

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

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

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

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

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

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

2 голосов
/ 06 марта 2018

Photoshop использует интерполирующий кубический сплайн для кривой, как было исследовано на отдельном потоке Math StackExchange .

2 голосов
/ 10 ноября 2011

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

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

0 голосов
/ 05 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...