2017-01-23 10 views
0

В этом вопросе рассматривается, в частности, вопрос о подгонке кривой в контексте цветового смешивания красок, пигментов и т. Д.Хороший метод интерполяции для смешивания цветов?

Я пытаюсь угадать требуемые пропорции двух красок, скажем, «Браун» (B) и «белый» (W), чтобы перейти к заданному значению освещенности L.

Я сделал «калибровочную кривую» таким же образом, как и для применения закона Беэр-Ламберта в области химии. Однако кривая не является линейной, поэтому я не могу использовать закон Бера-Ламберта.

Вот что я сделал:

(1)

  • Я измерил спектр образцов краски для этих пропорций смеси, маркирован A, B, C, D, .. п.

    A >>> W = 1, B = 0 (чистый белый)

    б >>> W = 63/64, В = 1/64

    C >>> W = 31/32, В = 1/32

    д >>> Ш = 15/16, В = 1/16

    е >>> W = 7/8, В = 1/8

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

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

    ч >>> W = 0, B = 1 (чисто коричневый)

И эти спектральные кривые отражения, что я получил:

reflectance curves

Если я пикап одно значение коэффициента отражения на данной длине волны, например, 500 нм, я получаю эту красивую кривую, где ось х представляет собой часть белой краски в смеси, а у оси отраженного света при длине волны 500 нм: amount of white VS reflectance at 500 nm

я хотел бы угадать интерполяцией, сколько белый Мне нужно достичь определенного количества отраженного света.

(2)

Я пытался соответствовать экспоненте к данным с scipy.optimize.curve_fit но подгонка довольно беден:

exponential fit of data

Какие функции будут плотно прилегать к данным?

+1

Я бы поместил экспоненциальную кривую: http://stackoverflow.com/questions/3433486/how-to-do-exponential-and-logarithmic-curve-fitting-in- python-i-found-only-poly – Javier

+0

@ Javier вы могли бы помочь мне понять, как подогнать его к экспоненциальному cur ve, я не уверен, что понимаю, как это сделать ... –

+0

Возможный дубликат [Использование кривой \ _fit для соответствия данным] (http://stackoverflow.com/questions/10857948/use-of-curve-fit- to-fit-data) – Lucas

ответ

1

Я буду расширять свой комментарий, так как никто не ответил.

Из того, что я вижу на рисунке, есть узор. Лучшим способом было бы соответствовать кривой, которая соответствует этой схеме в целом.Вы можете сделать это без какой-либо математики с использованием Eureqa (свободное судебное разбирательство должно быть достаточно): http://www.nutonian.com/products/eureqa/

Если вы хотите оставаться в питоне и соответствовать экспоненциальному распределению, вы можете сделать следующее: How to do exponential and logarithmic curve fitting in Python? I found only polynomial fitting

Так себе у вас есть для длины волны 500 нм следующие значения:

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) 

В этом случае мы получаем, что а, Ь и с являются:

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

Таким образом, чтобы получить значение отраженного света при определенных х (например, 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 

А затем найти значение (например, х = 0,2):

ynew = f(0.2) 

Который 6,549

Или иметь много значений, так что вы можете построить их: Ynew = F (н.п. .linspace (0,1,1000)

+0

Извините, я не проверял ваш ответ, потому что экспоненциальная посадка дает очень плохую аппроксимацию данных. Какие-либо предложения? –

+0

Я отредактировал вопрос, надеюсь, это поможет. – Javier

+0

Я приготовил это решение, но я не уверен, что он умный: http://stackoverflow.com/questions/41856164/how-good-is-this-interpolation-method –

 Смежные вопросы

  • Нет связанных вопросов^_^