基本上,我想要做的是了解如何计算沿着'曲线'的值,如photoshop曲线框中所示:
因此,给定N点,其中x在0和1之间,y在0和1之间 - 我们将创建一条穿过所有这些点的曲线。鉴于此曲线,我希望能够计算任何给定X的曲线的所有值。
换句话说,我想像曲线框一样修改颜色值,但是以编程方式修改。
我读过这些是“catmull-rom splines” - 但我看到的只是一个依赖于参数T的函数 - 我希望能够查找x的值。如果可能,我想在C中这样做
答案 0 :(得分:7)
此代码似乎与Photoshop的曲线完全匹配(不是我的代码):http://www.developpez.net/forums/d331608-3/autres-langages/algorithmes/contribuez/image-interpolation-spline-cubique/#post3513925
答案 1 :(得分: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 :(得分:2)
这是一个vbscript的链接,似乎可以实现photoshop使用的三次样条曲线。
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=68577&lngWId=-1
答案 3 :(得分:2)
Photoshop使用 interpolating cubic spline 作为曲线,正如a separate Math StackExchange thread所述。
答案 4 :(得分:0)
我不熟悉C-R,但如果它像beziers,则T参数从曲线部分的一个端点处的0变化到另一个端点处的一个。这就是你如何“走上”曲线。所以你不能只是插入你输入的x值。你可以在某个任意间隔采样一个长的,或者你可以使用某种目标寻找算法来接近给定的x值,达到你认为必要的任何精度。