如何通过每种颜色的分数贡献在n种颜色之间进行插值?

时间:2016-07-20 10:27:20

标签: image-processing computer-vision interpolation spatial-interpolation bilinear-interpolation

如何在n种颜色之间进行插值。

2种颜色的简单案例

首先考虑一个更简单的案例,我们想要找到2种颜色的中点。

Color1 is RGB ( 255, 0, 0 ) // Red
Color2 is RGB ( 128, 128, 128 ) // Grey

解决方案是每个R,G,B之间的中间点单独考虑。

RGB ( 128 + 64, 128 / 2, 128 / 2 ) = RGB ( 192, 64, 64 )

由于中点正好位于两者之间并且与插值存在线性关系,因此可以在Color1和Color2之间插入小数量(如0.25),颜色应该更接近Color1。 / p>

RGB ( 255 - 32, 32, 32 ) = RGB ( 223, 32, 32 )

n种颜色的情况

我希望找到解决方案的案例是有n种颜色,其中每种颜色的分数加权总计达1.0。

(猜测,我猜每种颜色都可以被认为是三维空间中的一个点,加权描述插值点相对于每个颜色点的距离)

颜色插值仅为线性RGB。

在某些条件下,我猜可能有多个整数值是问题的解决方案,例如,如果有少数颜色具有相似的值。

我读到有双线性插值可能有助于解决这个问题。

通常颜色数量不超过5,通常为2,3或4种颜色。

2 个答案:

答案 0 :(得分:1)

您的猜测将提供可接受的解决方案(是的,您需要单独插入每个维度)。

问题是,颜色空间可以由多个模型描述,每个模型具有不同的维数。根据您选择RGB,CMYK,HSL还是任何其他奇特的描述,插值看起来会有所不同 - 由于差异主要是美学,因此很难用非常技术的术语来描述。例如,使用HSL进行插值将始终使用颜色圆在颜色之间移动。

可以在Krita手册中找到使用不同颜色模型进行计算(及其带来的复杂性)的一些后果的一个很好的描述:https://userbase.kde.org/Krita/Manual/ColorManagement

答案 1 :(得分:0)

解决问题的一些Java代码位于此处,请注意它使用Scala SBT构建,但是它的Java代码。

https://github.com/PhilAndrew/betweenrgb

此处测试加权颜色的合并:

https://github.com/PhilAndrew/betweenrgb/blob/master/src/test/java/between/rgb/MergeWeightedColorsTest.java