module/script 从基于点的平滑曲线(RGB 曲线类型)中获取所有值的 table

A module/script to get the table of all values from a points based smooth curve (RGB curves type of thing)

我想根据特定点为从 0 到 255 的 input/output 曲线生成 table 个值,并使该曲线平滑。

这和我们用RGB曲线编辑图片的亮度基本一样

例如我会定义点 0,0 ; 128,104; 255,255,我会得到从 0 到 255 的所有值,并且在 128,104 左右有一些平滑(非线性)。我最终将能够配置该曲线的平滑程度。

我可以对它进行编程,但似乎有点痛苦,而且我很确定这样的东西已经作为模块或脚本存在了。

谢谢!

编辑:

来自 Benjamin W. 的答案使用以下代码生成以下结果:

require Math::Spline;

my @x = (0, 64, 128, 204, 255);
my @y = (0, 12, 64, 224, 255);

$spline = Math::Spline->new(\@x,\@y);
for( my $a = 0 ; $a < 256 ; $a++ ){
    print("$a\t".$spline->evaluate($a)."\n");
}

通过spline interpolation, where you calculate a piecewise polynomial. For Perl, there is the module Math::Spline.

可以顺利连接点

对于您的示例(略微修改以使 "bend" 更清晰可见),它大致如下所示:

use strict;
use warnings;
use feature 'say';
use Math::Spline;

my @x = (0, 210, 255);
my @y = (0, 124, 255);
my $spline = Math::Spline->new(\@x, \@y);

my @x_interp = (0 .. 255);
my @y_interp;
for my $x_i (@x_interp) {
    push @y_interp, $spline->evaluate($x_i);
}

say "$x_interp[$_]\t$y_interp[$_]" for (0 .. 255);

输出可以通过管道传输到文件并绘制,例如使用 gnuplot: