当前位置:   article > 正文

用OpenCV实现Photoshop算法(三): 曲线调整

用OpenCV实现Photoshop算法(三): 曲线调整

三、曲线调整( Curves Adjustment )

曲线调整是Photoshop的最常用的重要功能之一。

网上关于曲线技术原理的材料都不完整。经过一个多月的探索、不断实验,我用OpenCV实现了曲线功能,基本算是揭开了“曲线之谜“。

(一)曲线原理

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

我们先来分析对单通道一条曲线的原理,比如:对红色通道定义一条曲线如下:

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

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

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

调整的实现:    当输入(红色通道值)为X1时,将输出值(新的红色通道值)设为曲线对应的值  Y1.

代码实现: 对图片的所有像素点进行扫描, 取红色值 X1,   换为 对应的 Y1.  其它两个通道值(绿蓝)不变。

         比如:  像素点的RGB= (127,  230, 220),  其中红色值为 X1 = 127,    对应曲线上的值Y1 = 154, 则对该通道曲线调整后 像素点的RGB= (154,  230, 220)

如果曲线仅是一条由左下角到右上角的45度斜线,则 X1 总是等于 Y1, 则曲线调整后 图片不变。

对红、绿、蓝三个独立通道调整方式都与上述算法相同。各通道调整是互不相关的。

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

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

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

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

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

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

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

由于曲线调整仅仅是数值替换,可以用一个转换表进行快速运算, 因此,曲线调整的速度是很快的。

(二)曲线的生成

Photoshop使用的曲线是一种SPline 曲线。这种曲线表现力很强,特点是:仅需要定义几个控制点,就可以定义一条平滑的曲线,且曲线同时通过所有控制点。生成曲线时,只需要给出几个控制点,调用曲线生成函数即可。

SPline的具体数学原理我就不讲了,生成函数可以看下面的源码Curves.cpp中的spline()函数

(三)曲线调整的OpenCV实现

我用opencv写了两个 C++ 类: Curves类实现了多通道的曲线的定义、绘制、实施调整。  Curve类是一个通道的曲线定义类。

源码共两个文件:    Curves.hpp,  Curves.cpp,    源码及使用例程可在这里下载: 曲线算法源码

源码有一定的长度,不具体解释了,请见注释。补充说明几点:

1, Curves类中定义了四个Curve对象(即四个通道),分别是RedChannel, GreenChannel, BlueChannel 和 RGBChannel.

2,  Curves类支持用鼠标生成曲线,使用方法见例程。

2, Curves.cpp中的spline()函数是生成曲线数值的,即输入一串控制点,通过插值运算,生成一系列的输出值。  

3, 除了用鼠标生成曲线以外, 也可以用程序代码直接生成曲线:

     先使用Curve类的clearPoints()方法清除所有控制点,再调用addPoint()方法逐个添加控制点即可。

(四)例程

写一个例程,使用Curves类,实现曲线调整。

程序中定义了两个窗口,一个是图片窗口,一个是曲线窗口


原图:

对红色通道(Channel 1)进行曲线调整

然后,对RGB通道(Channel 0)来一个经典的S型曲线调整

呵呵,有点味道了
--------------------- 
作者:JoStudio 
来源:CSDN 
原文:https://blog.csdn.net/c80486/article/details/52499919 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

https://blog.csdn.net/wujuxKkoolerter/article/details/91903762

https://blog.csdn.net/haigear/article/details/85252418

https://wenku.baidu.com/view/1549dccfbb4cf7ec4afed083.html

https://blog.csdn.net/leemboy/article/details/83628350

https://blog.csdn.net/drinktonton/article/details/51040000

https://blog.csdn.net/zb1165048017/article/details/48311603

https://baike.baidu.com/item/%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BF/6418744

https://zhidao.baidu.com/question/2382389.html

https://www.jianshu.com/p/49aff913104c

https://blog.csdn.net/qq_37887537/article/details/78498209

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/264037
推荐阅读
相关标签
  

闽ICP备14008679号