如何在photoshop曲线背后重现数学

问题描述 投票:12回答:5

基本上,我想要做的是理解如何计算沿着'曲线'的值,如photoshop曲线框中所示:

因此,给定N点,其中x在0和1之间,y在0和1之间 - 我们将创建一条穿过所有这些点的曲线。鉴于此曲线,我希望能够计算任何给定X的曲线的所有值。

换句话说,我想像曲线框一样修改颜色值,但是以编程方式。

我已经读过这些是“catmull-rom splines” - 但我看到的只是一个依赖于参数T的函数 - 我希望能够查找x的值。如果可能的话,我想在C中这样做

math graphics
5个回答
3
投票

使用Catmull-Rom Spline是因为它是一种样条曲线,它表示一条曲线,您可以在其中添加控制点并细化曲线本身(这是您在单击以添加新点时在Photoshop上执行的操作),具有特殊性使曲线通过您指定的每个控制点。

在任何情况下,你只需要一个函数,它取一个值(在0..1中浮动或在0..255中的int或你拥有的任何颜色空间)将生成另一个。

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

当然,这可以通过任何类型的功能来完成。最基本的是默认的身份功能

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

任何其他函数都可以用曲线计算,它可以正常但开发起来更复杂,我建议你从简单的例子开始,比如Bezier曲线。在任何情况下使用t参数是因为这些是参数曲线,你需要在深入研究之前了解一些曲线的数学背景,看看here



2
投票

这是一个vbscript的链接,它似乎实现了photoshop使用的三次样条曲线。

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


1
投票

Photoshop使用interpolating cubic spline作为曲线,正如a separate Math StackExchange thread所探讨的那样。


0
投票

我不熟悉C-R,但如果它像beziers,则T参数从曲线部分的一个端点处的0变化到另一个端点处的一个。这就是你如何“走上”曲线。因此,您不能只插入一个x值。您可以在某个任意间隔采样一段长或者您可以使用某种目标搜索算法将给定的x值逼近您认为必要的精度。

© www.soinside.com 2019 - 2024. All rights reserved.