一个模块/脚本,用于从基于点的平滑曲线(RGB 曲线类型的事物)中获取所有值的表

Posted

技术标签:

【中文标题】一个模块/脚本,用于从基于点的平滑曲线(RGB 曲线类型的事物)中获取所有值的表【英文标题】:A module/script to get the table of all values from a points based smooth curve (RGB curves type of thing) 【发布时间】:2015-08-01 02:50:10 【问题描述】:

我想根据特定点为从 0 到 255 的输入/输出曲线生成一个值表,并使该曲线平滑。

基本上和我们用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 的东西吗?如果是这样,Math::Spline 应该很有用。 这就是答案! :) 请张贴,我会选择它!谢谢 :) 太好了。 哈,当你添加图表时,我正在修补我的;)绘图仪的不错选择! 【参考方案1】:

平滑连接点可以通过spline interpolation 完成,您可以在其中计算分段多项式。对于 Perl,有模块 Math::Spline。

对于您的示例(稍作修改以使“弯曲”更好地可见),大致如下所示:

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:

【讨论】:

以上是关于一个模块/脚本,用于从基于点的平滑曲线(RGB 曲线类型的事物)中获取所有值的表的主要内容,如果未能解决你的问题,请参考以下文章

Bezier(贝塞尔)曲线简介

MATLAB中将折线改为平滑曲线

echarts 曲线平滑配置

通过点平滑曲线,仅使用水平、垂直线和固定半径弧

用于手指触摸绘图的 UIBezierPath 平滑曲线

基于三阶贝塞尔曲线的数据平滑算法