Algorithm “的算法是什么?”;“振动”;过滤器?

Algorithm “的算法是什么?”;“振动”;过滤器?,algorithm,image-processing,colors,Algorithm,Image Processing,Colors,许多应用程序都有一个振动过滤器,它可以增加肤色以外的颜色饱和度。我想知道这个过滤器背后的算法是什么——是否有可以指出的来源?这取决于它是“正振动”还是“负振动”。负振动就是去饱和。正振动增加了颜色的饱和度,但对于一开始饱和程度较低的颜色,正振动会增加更多,如果红色成分是最大的成分,则会有一些特殊的变化。看看一个实现,大致就是这样的:(我不能保证它与您定义的Vibrance相对应,这是一件相当神秘的事情) 或多或少。除了实现之外,我没有什么要指出的,似乎没有人想谈论它。你有一个评论版本(比如,un

许多应用程序都有一个振动过滤器,它可以增加肤色以外的颜色饱和度。我想知道这个过滤器背后的算法是什么——是否有可以指出的来源?

这取决于它是“正振动”还是“负振动”。负振动就是去饱和。正振动增加了颜色的饱和度,但对于一开始饱和程度较低的颜色,正振动会增加更多,如果红色成分是最大的成分,则会有一些特殊的变化。看看一个实现,大致就是这样的:(我不能保证它与您定义的Vibrance相对应,这是一件相当神秘的事情)


或多或少。除了实现之外,我没有什么要指出的,似乎没有人想谈论它。

你有一个评论版本(比如,unGamma到底做什么)或者一个有更多信息的源吗?@AllanLRH
unGamma
将颜色转换为线性空间,与
Gamma
相反(这是Gamma,就像“Gamma校正”中的Gamma),这取决于图像所在的颜色空间,通常这两个函数都是查找表)。我真的没有一个合适的信息源,我能得到这么多信息的唯一方法是通过反编译实现它的代码——非常奇怪的代码。例如,为什么它对主色为红色的颜色使用特殊处理,或者为什么它在线性和伽马校正RGB中混合计算?在我看来,两者都像是由于缺乏良好且一致的饱和度度量而做出的草率而武断的设计决策。哈罗德,谢谢你费心去反编译。@Harold
scale2
还不熟悉。你有打字错误吗?可能需要对主要的红色进行特殊处理,以免破坏肤色。我已经删除了我的答案,但如果时间允许,我会发布一个更好的答案。很抱歉
x = max(r, g, b)
y = min(r, g, b)
gray = toGray(unGamma(r, g, b))
scale = input
if x == r:
    t = min(1, abs((g - b) / (x - y)))
    scale = scale * (1 + t) * 0.5
a = (x - y) / 255
scale1 = scale * (2 - a)
scale2 = 1 + scale1 * (1 - a)
sub = y * scale1
r = unGamma(r * scale2 - sub)
g = unGamma(g * scale2 - sub)
b = unGamma(b * scale2 - sub)
gray2 = toGray(r, g, b)
r *= gray / gray2
g *= gray / gray2
b *= gray / gray2
m = max(r, g, b)
if Gamma(m) > 255:
    scale = (unGamma(255) - gray2) / (m - gray2)
    r = (r - gray2) * scale + gray2
    g = (g - gray2) * scale + gray2
    b = (b - gray2) * scale + gray2
(r, g, b) = Gamma(r, g, b)