C++ 图像处理 之 亮度、色彩平衡调整(逼近PS法)
关键词:图像处理亮度调整 色彩平衡Photoshop
参考博客
http://blog.youkuaiyun.com/maozefa/article/details/4493395
http://www.cnblogs.com/Imageshop/archive/2011/11/10/2244664.html
本人参照Photoshop的亮度、色彩平衡调整原理,得到公式表示为:
dstRGB = srcRGB+ f(srcRGB) *g(dv)
其中dstRGB 为目标色彩,srcRGB 为原始色彩,dv为变化程度范围为 [-1,+1],f(x)和g(x)是对原始色彩srcRGB和变化程度dv的函数。一般情况下y=g(x)为线性函数,一般情况下,y=f(x)为非线性函数,重点是获得该函数。(备注,大多数开源软件设定y=f(x)为线性函数,或简单的二次多项式)
在代码处理上,大多数软件采用了灰度表查找法,先按制造了一个256个元素大小的线性亮度查找表,然后对图像数据逐像素按R、G、B分量值在查找表中取得调整后的数据。反之,我们可以通过先建立灰度表,再反推该函数。
各软件使用不同的映射函数,为实现Photoshop中的等价效果,最简单的方式是,通过软件操作测试,对不同灰度值srcGray[i],在亮度调整操作后+d,得到映射的desGray[i]。以下是使用灰度色阶图(左图1),在Photoshop中分别对亮度增强100(中图2)和对色彩平衡R增加100(右图3)的情况下
以下是对上面三图不同原始灰度上获得变化后的灰度值,建立下表。
原始灰度 | 亮度增强 | 色彩平衡 | 亮度增强后差值 | 色彩平衡差值 |
0 | 0 | 0 | 0 | 0 |
6 | 11 | 23 | 5 | 17 |
12 | 23 | 43 | 11 | 31 |
20 | 38 | 66 | 18 | 46 |
28 | 53 | 84 | 25 | 56 |
37 | 69 | 97 | 32 | 60 |
46 | 86 | 108 | 40 | 62 |
57 | 107 | 121 | 50 | 64 |
67 | 128 | 132 | 61 | 65 |
79 | 146 | 143 | 67 | 64 |
90 | 164 | 152 | 74 | 62 |
102 | 181 | 162 | 79 | 60 |
114 | 195 | 172 | 81 | 58 |
127 | 208 | 180 | 81 | 53 |
138 | 218 | 189 | 80 | 51 |
151 | 227 | 197 | 76 | 46 |
162 | 233 | 204 | 71 | 42 |
175 | 239 | 212 | 64 | 37 |
186 | 243 | 218 | 57 | 32 |
197 | 246 | 225 | 49 | 28 |
207 | 249 | 230 | 42 | 23 |
217 | 250 | 236 | 33 | 19 |
225 | 252 | 241 | 27 | 16 |
234 | 253 | 245 | 19 | 11 |
241 | 254 | 249 | 13 | 8 |
255 | 255 | 255 | 0 | 0 |
其中第一列为原始灰度值,第二列为增加亮度100后的灰度值,第三列为色彩平衡R增加100后的值,第四列为第二列减去第一列,第五列为第三列减去第一列。对上表进行归一化处理后,建立第四列与第一列的关系图(下图蓝色)和第五列与第一列关系图(下图红色),并建立多项式逼近。(此处可使用其他函数逼近,如指数函数、对数函数、分段函数)
以上重点讲究的是一种方法,而不是得出的数据结果。采样实验存在一定误差,结果数据请慎重使用。
此处推荐一下开源c++图像处理软件cximage和ImageStone。以下使用ImageStone测试。