C#实现PS曲线调整,OpenCV实现

发布时间 2023-08-10 19:40:56作者: 我叫小鱼

曲线原理 

对于一个RGB图像,  可以对R,  G,  B 通道进行独立的曲线调整,即,对三个通道分别使用三条曲线(Curve)。还可以再增加一条曲线对 三个通道进行整体调整。 因此,对一个图像,可以用四条曲线调整。最终的结果,是四条曲线调整后合并产生的结果。

比如:对红色通道定义一条曲线如下:

 

图中,横轴(x)是输入,比左到右分别表示0到255.  纵轴(y)是输出,从下到上分别表示0到255.

该曲线由三个点定义,座标分别为:  点1(0,0),  点2(106,156),点3(255,255)

点1和点3是默认产生的,  点2是我们新增加的。在这三个点中画出一条曲线(Spline).

Spline 插值的原理是通过一系列的局部函数,对数据进行拟合和插值。具体来说,当我们需要拟合一个数据集时,我们可以将该数据集分成若干段,每一段都应该对应一个函数。这些函数连在一起,就可以得到一个光滑的曲线,这就是 Spline 插值的基本原理。

 

然后,我们再来分析对RGB通道进行整体调整的原理。

 比如:  像素点的RGB= (152,  149, 166),  对RGB通道进行整体调整, 则根据该曲线同时对R, G, B三个值进行调整。

     R = 152 作为输入值,  计算曲线上的 对应输出值  R1 

     G = 149 作为输入值,   计算曲线上的 对应输出值  G1 

     B = 166 作为输入值, 计算曲线上的 对应输出值  B1 

     则新的像素点的RGB =(R1, G1, B1)

 

用几条曲线同时调整时,先对红、绿、蓝三个独立通道分别进行调整,最后对RGB总通道进行调整。

由于曲线调整仅仅是数值替换,可以用一个转换表进行快速运算(Mat Lut = new Mat(1, 256, MatType.CV_8UC1);), 因此,曲线调整的速度是很快的。

 代码如下:

 

运行效果如下:

使用红色通道调整:

 

使用RGB、红、绿、蓝四条曲线进行调整

 

经过本人几轮和PS对比,和PS曲线基本一模一样可以说零差别。

完整代码路径:https://download.csdn.net/download/qq_40451022/88202276