这是我对另一个问题的回答的快速`n肮脏改编,该问题涉及将一系列值映射到伪颜色,从而使它们可以映射到整个RGB颜色调色板,而不是仅映射到两个。请注意,中间颜色是在RGB色彩空间而不是HSV中插值的(在我看来,这通常看起来更好,但需要更多的计算)。
我对它并不完全满意,但是这个周末我的时间非常有限,至少到目前为止,我的工作似乎可行,即使它不是最佳选择,因此我将其发布给您,以供您试用:
def palette_pseudocolor(val, minval, maxval, palette): max_index = len(palette)-1 # convert val in range minval...maxval to range 0..max_index v = (float(val-minval) / (maxval-minval)) * max_index # split result into integer and fractional parts i = int(v); f = v-i # interpolate between two colors in the palette c0, c1 = palette[i], palette[min(i+1, max_index)] d = c1[0]-c0[0], c1[1]-c0[1], c1[2]-c0[2] return c0[0]+f*d[0], c0[1]+f*d[1], c0[2]+f*d[2]if __name__ == '__main__': numsteps = 10 palette = [(1,0,0), (0,1,0), (0,0,1)] # [RED, GREEN, BLUE] print 'val R G B' for val in xrange(0, 100+numsteps, numsteps): print ('%3d -> (%.3f, %.3f, %.3f)' % ((val,) + palette_pseudocolor(val, 0, 100, palette)))输出:
val R G B 0 -> (1.000, 0.000, 0.000) 10 -> (0.800, 0.200, 0.000) 20 -> (0.600, 0.400, 0.000) 30 -> (0.400, 0.600, 0.000) 40 -> (0.200, 0.800, 0.000) 50 -> (0.000, 1.000, 0.000) 60 -> (0.000, 0.800, 0.200) 70 -> (0.000, 0.600, 0.400) 80 -> (0.000, 0.400, 0.600) 90 -> (0.000, 0.200, 0.800)100 -> (0.000, 0.000, 1.000)
这是示例中使用红色,绿色和蓝色调色板产生的颜色渐变:



