当前位置: 首页 > 知识库问答 >
问题:

计算一系列值的 RGB 值以创建热图

崔高远
2023-03-14

我正在尝试用python创建热图。为此,我必须为可能值范围内的每个值指定一个RGB值。我想把颜色从蓝色(最小值)改为绿色(最大值)。

下面的图片示例解释了我对颜色组成的看法:我们有一个范围,从1(纯蓝色)到3(纯红色),2介于两者之间,类似于绿色。

我阅读了关于线性插值的内容,并编写了一个函数(或多或少)来处理在最小值和最大值之间的某个值的计算,并返回一个RGB元组。它使用ifelifconditions(这不会让我完全满意):

def convert_to_rgb(minimum, maximum, value):
    minimum, maximum = float(minimum), float(maximum)    
    halfmax = (minimum + maximum) / 2
    if minimum <= value <= halfmax:
        r = 0
        g = int( 255./(halfmax - minimum) * (value - minimum))
        b = int( 255. + -255./(halfmax - minimum)  * (value - minimum))
        return (r,g,b)    
    elif halfmax < value <= maximum:
        r = int( 255./(maximum - halfmax) * (value - halfmax))
        g = int( 255. + -255./(maximum - halfmax)  * (value - halfmax))
        b = 0
        return (r,g,b)

然而,我想知道是否可以在不使用if条件的情况下为每个颜色值编写函数。有人有主意吗?非常感谢!

共有3个答案

强阳曜
2023-03-14

您通常可以将带有索引的if消除为两个值的数组。Python缺少三元条件运算符,但这种方法有效:

r = [red_curve_1, red_curve_2][value>=halfmax]
g = [green_curve_1, green_curve_2][value>=halfmax]
b = [blue_curve_1, blue_curve_2][value>=halfmax]

*_curve_1*_curve_2表达式分别替换为中点左右的常数或斜率或曲线。

我将把这些替换留给您,但例如:

  • red_curve_1blue_curve_2简约 0
  • green_curve_1255*(最小值)/(最小值半数)
  • 等。
冯文彬
2023-03-14

这里有另一种方法,虽然不尽可能短,但更通用,因为它还没有针对您的特定颜色集进行硬编码。这意味着它还可以用于在任意颜色的可变大小调色板上线性插值指定范围的值。

还要注意,颜色可能已经被内插在其他色彩空间中,从而产生比其他色彩空间更令人愉悦的结果。从我提交的两个不同的答案中可以看出这一点,这两个答案都与一个名为范围的相关问题有关

import sys
EPSILON = sys.float_info.epsilon  # Smallest possible difference.

def convert_to_rgb(minval, maxval, val, colors):
    # `colors` is a series of RGB colors delineating a series of
    # adjacent linear color gradients between each pair.

    # Determine where the given value falls proportionality within
    # the range from minval->maxval and scale that fractional value
    # by the total number in the `colors` palette.
    i_f = float(val-minval) / float(maxval-minval) * (len(colors)-1)

    # Determine the lower index of the pair of color indices this
    # value corresponds and its fractional distance between the lower
    # and the upper colors.
    i, f = int(i_f // 1), i_f % 1  # Split into whole & fractional parts.

    # Does it fall exactly on one of the color points?
    if f < EPSILON:
        return colors[i]
    else: # Return a color linearly interpolated in the range between it and 
          # the following one.
        (r1, g1, b1), (r2, g2, b2) = colors[i], colors[i+1]
        return int(r1 + f*(r2-r1)), int(g1 + f*(g2-g1)), int(b1 + f*(b2-b1))

if __name__ == '__main__':
    minval, maxval = 1, 3
    steps = 10
    delta = float(maxval-minval) / steps
    colors = [(0, 0, 255), (0, 255, 0), (255, 0, 0)]  # [BLUE, GREEN, RED]
    print('  Val       R    G    B')
    for i in range(steps+1):
        val = minval + i*delta
        r, g, b = convert_to_rgb(minval, maxval, val, colors)
        print('{:.3f} -> ({:3d}, {:3d}, {:3d})'.format(val, r, g, b))

数字输出:

  Val       R    G    B
1.000 -> (  0,   0, 255)
1.200 -> (  0,  50, 204)
1.400 -> (  0, 101, 153)
1.600 -> (  0, 153, 101)
1.800 -> (  0, 204,  50)
2.000 -> (  0, 255,   0)
2.200 -> ( 51, 203,   0)
2.400 -> (102, 152,   0)
2.600 -> (153, 101,   0)
2.800 -> (203,  51,   0)
3.000 -> (255,   0,   0)

这是可视化为水平渐变的输出:

徐淳
2023-03-14
def rgb(minimum, maximum, value):
    minimum, maximum = float(minimum), float(maximum)
    ratio = 2 * (value-minimum) / (maximum - minimum)
    b = int(max(0, 255*(1 - ratio)))
    r = int(max(0, 255*(ratio - 1)))
    g = 255 - b - r
    return r, g, b
 类似资料:
  • 我目前正在编码一个colorpicker并尝试创建一个函数,它需要3个介于0和255(RGB)之间的整数。 如果你看上面链接的图像,你可以看到在中心有一个彩虹-渐变。上面的所有RGB值至少包含一个0和一个255的整数。另一个可以是0到255之间的任何值。然后在图像的左边有一个正方形,它包含这个“彩虹颜色”的所有“子颜色”的渐变。 函数应该取这个子颜色的RGB值(例如,R=112,G=158,B=7

  • 本文向大家介绍Python实现计算图像RGB均值方式,包括了Python实现计算图像RGB均值方式的使用技巧和注意事项,需要的朋友参考一下 要求 存在一个文件夹内有若干张图像,需要计算每张图片的RGB均值,并计算全部图像的RGB均值。 代码 这里需要注意cv2.imread()读取顺序为BGR问题。 注意 路径不能出现中文,不然容易出错。 错误如下: TypeError: 'NoneType' o

  • 我有这张桌子, 我想要表中的uid计数和订单价格中的uid计数 我这样做: 但我得到的结果是: 有什么问题?

  • 问题内容: 我已经在处理以下代码,但是似乎找不到一种方法来计算字谜列表中唯一值的数量。如果我只是打印出:我会得到列表的总价值,但其中包括重复项。 我试图将列表转换为集合,然后再删除掉重复项,但是还没有任何运气。 谢谢! 问题答案: 使用。仅包含唯一值:

  • 问题内容: 我有一个表,其中包含商店中每件商品的单价和其他详细信息。 另一个包含每个订单中包含的项目的详细信息。 现在我要计算 请注意,我希望它成为表本身的一部分,而不是作为其他视图或查询。我怎样才能做到这一点?我为此研究了触发器和其他机制,但是它们是否适用于不同表中的值,尤其是在存在此类约束的情况下? 我尝试过根据另一列计算出的Column进行以下触发吗?: 但这似乎没有用 问题答案: 这是如何