良好的颜色混合插值方法?

时间:2017-01-23 09:25:49

标签: python numpy colors interpolation spectrum

这个问题特别针对油漆,颜料等颜色混合背景下的曲线拟合问题。

我试图猜测两种颜料所需的比例,让我们说“棕色”(B)和“白色”(W)来得到给定的亮度值L.

我以同样的方式制作了“校准曲线”,以便在化学中应用Beer-Lambert定律。但是,曲线不是线性的,所以我不能使用Beer-Lambert定律。

这就是我所做的:

(1)

  • 我测量了这些混合物比例的油漆样品谱,标记为a,b,c,d等......

    a>>> W = 1,B = 0(纯白)

    b>>> W = 63/64,B = 1/64

    c>>> W = 31/32,B = 1/32

    d>>> W = 15/16,B = 1/16

    e>>> W = 7/8,B = 1/8

    f>>> W = 3/4,B = 1/4

    g>>> W = 1/2,B = 1/2

    h>>> W = 0,B = 1(纯棕色)

这些是我得到的光谱反射曲线:

reflectance curves

如果我在给定波长下拾取一个反射率值,例如500 nm,我得到这条漂亮的曲线,其中x轴代表混合物中白色涂料的比例,y轴代表500 nm处的反射光: amount of white VS reflectance at 500 nm

我想通过插值猜测我需要多少白光到达一定量的反射光。

(2)

我试图使用scipy.optimize.curve_fit将指数曲线拟合到数据,但拟合非常差:

exponential fit of data

什么样的功能能够紧密贴合数据?

1 个答案:

答案 0 :(得分:1)

我会扩展我的评论,因为没有人回答。

从我在图中看到的,有一个模式。最好的方法是拟合一个适合整个模式的曲线。您可以使用Eureqa进行无需任何数学计算(免费试用应该足够):http://www.nutonian.com/products/eureqa/

如果要保留python并使其符合指数分布,可以执行以下操作: How to do exponential and logarithmic curve fitting in Python? I found only polynomial fitting

所以想象一下,你在500nm波长处有以下数值:

y = [10,20,30,30,50,60,70,80,90,100]
x = [0.,0.3,0.5,0.6,0.72,0.77,0.84,0.9,0.95,1]

然后,拟合指数曲线的代码为:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def func(x, a, b, c):
    return a * np.exp(-b * x) + c

popt, pcov = curve_fit(func, x, y)

在这种情况下,我们得到a,b和c是:

popt = array([ 7.1907744 , -2.62804994,  2.45029842])

因此,为了获得某个x(例如0.2)的反射光的值,你可以这样做:

func(0.2, 7.1907744 , -2.62804994,  2.45029842)

这是14.61

但是你说它不合适,如果你不需要模型,你可以做以下事情:如果你真的不关心模型你可以使用它:https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d

from scipy import interpolate
f = interpolate.interp1d(x, y, kind="quadratic") #you can try different kinds of interpolation

然后找到一个值(例如x = 0.2):

ynew = f(0.2)

这是6.549

或者有很多值,所以你可以绘制它们:     ynew = f(np.linspace(0,1,1000)

相关问题