Поскольку вы пытаетесь эмулировать существующий градиент, а не создаете его из произвольных цветов, просто становится вопросом поиска формулы, которая соответствует измеренным значениям градиента.
Начните с взятия среднего пикселя rзначения g, b в каждой точке градиента.Сначала вам нужно получить чистое изображение, у того, что вы разместили, есть белая рамка и некоторые звуки по краям;Я использовал редактор изображений, чтобы очистить это.
После того, как вы измерили значения, вы можете использовать numpy.polyfit
, чтобы сделать подгонку кривой.Я предположил, что для хорошей подгонки достаточно 5 градусов, получив массив из 6 коэффициентов.Здесь вы можете увидеть график измеренных значений с наложенной кривой.Очень хорошее совпадение, я бы сказал.
А вот код для воссоздания градиента с использованием этих кривых.
rp = [-1029.86559098, 2344.5778132 , -1033.38786418, -487.3693808 ,
298.50245209, 167.25393272]
gp = [ 551.32444915, -1098.30287507, 320.71732031, 258.50778539,
193.11772901, 30.32958789]
bp = [ 222.95535971, -1693.48546233, 2455.80348727, -726.44075478,
-69.61151887, 67.591787 ]
def clamp(n):
return min(255, max(0, n))
def gradient(x, rfactors, gfactors, bfactors):
'''
Return the r,g,b values along the predefined gradient for
x in the range [0.0, 1.0].
'''
n = len(rfactors)
r = clamp(int(sum(rfactors[i] * (x**(n-1-i)) for i in range(n))))
g = clamp(int(sum(gfactors[i] * (x**(n-1-i)) for i in range(n))))
b = clamp(int(sum(bfactors[i] * (x**(n-1-i)) for i in range(n))))
return r, g, b
from PIL import Image
im = Image.new('RGB', (742, 30))
ld = im.load()
for x in range(742):
fx = x / (742 - 1)
for y in range(30):
ld[x,y] = gradient(fx, rp, gp, bp)