【问题标题】:Generate random colors (RGB)生成随机颜色 (RGB)
【发布时间】:2015-03-11 23:25:15
【问题描述】:

在朋友的建议下,我上周刚开始使用 python 进行图像处理,以生成随机颜色的图案。我在网上找到了这段脚本,它可以在 RGB 光谱中生成各种不同的颜色。

def random_color():
    levels = range(32,256,32)
    return tuple(random.choice(levels) for _ in range(3))

我只是很有趣地附加了这个脚本来只生成三种随机颜色中的一种。最好是红色、绿色和蓝色。

【问题讨论】:

    标签: python random rgb


    【解决方案1】:

    在 256(又名 8 字节)范围内生成 RGB 三元组的一种巧妙方法是

    color = list(np.random.choice(range(256), size=3))

    color 现在是一个大小为 3 的列表,其值范围为 0-255。您可以将其保存在一个列表中,以记录之前是否生成过颜色。

    【讨论】:

    • 应该是 color = list(np.random.random(size=3) * 256)
    • 或者没有np: rand_color = random.choices(range(256), k=3)
    【解决方案2】:

    您也可以使用十六进制颜色代码,

    Name    Hex Color Code  RGB Color Code
    Red     #FF0000         rgb(255, 0, 0)
    Maroon  #800000         rgb(128, 0, 0)
    Yellow  #FFFF00         rgb(255, 255, 0)
    Olive   #808000         rgb(128, 128, 0)
    

    例如

    import matplotlib.pyplot as plt
    import random
    
    number_of_colors = 8
    
    color = ["#"+''.join([random.choice('0123456789ABCDEF') for j in range(6)])
                 for i in range(number_of_colors)]
    print(color)
    

    ['#C7980A', '#F4651F', '#82D8A7', '#CC3A05', '#575E76', '#156943', '#0BD055', '#ACD338']

    让我们尝试在散点图中绘制它们

    for i in range(number_of_colors):
        plt.scatter(random.randint(0, 10), random.randint(0,10), c=color[i], s=200)
    
    plt.show()
    

    【讨论】:

    • 为什么不从 000000-FFFFFF 范围内选择随机颜色。例如,您可以使用以下内容:f"#{random.randrange(0x1000000):06x}"
    【解决方案3】:

    这里:

    def random_color():
        rgbl=[255,0,0]
        random.shuffle(rgbl)
        return tuple(rgbl)
    

    结果是红色、绿色或蓝色。但是,该方法不适用于其他颜色集,您必须构建一个包含所有要选择的颜色的列表,然后使用 random.choice 随机选择一个。

    【讨论】:

      【解决方案4】:
      color = lambda : [random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]
      

      【讨论】:

      • 嗨@Rahul,您能否为您的答案添加一些解释?
      • 这只是返回一个由 0 到 255 之间的三个随机数组成的数组,它们构成了 RGB 颜色规范。
      【解决方案5】:

      如果您不希望从 256×256×256 颜色的全部可能空间中对颜色进行采样 - 因为以这种方式产生的颜色可能看起来不“漂亮”,其中许多颜色太深或太白 - - 您可能想从颜色图中采样颜色。

      cmapy 包含color maps from Matplotlib(向下滚动以进行展示),并允许简单的随机抽样:

      import cmapy
      import random
      rgb_color = cmapy.color('viridis', random.randrange(0, 256), rgb_order=True)
      

      您可以通过添加范围步骤使颜色更加鲜明:random.randrange(0, 256, 10)

      【讨论】:

        【解决方案6】:

        受其他答案的启发,这是更正确的代码,它产生整数 0-255 值并在需要 RGBA 时附加 alpha=255:

        tuple(np.random.randint(256, size=3)) + (255,)
        

        如果你只需要 RGB:

        tuple(np.random.randint(256, size=3))
        

        【讨论】:

        • RGBA 值应在 0-1 范围内
        【解决方案7】:

        使用自定义颜色(例如,深红色、深绿色和深蓝色):

        import random
        
        COLORS = [(139, 0, 0), 
                  (0, 100, 0),
                  (0, 0, 139)]
        
        def random_color():
            return random.choice(COLORS)
        

        【讨论】:

          【解决方案8】:

          在 pygame 中,你可以这样做:

          import pygame
          import random
          
          r = random.randint(0, 255)
          g = random.randint(0, 255)
          b = random.randint(0, 255)
          rand_color = (r, g, b)
          

          对于更短的代码,这里有一个替代方案:

          import pygame
          import random
          
          rand_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
          

          然后您可以使用参数rand_color 为随机颜色创建一个形状,例如:

          pygame.draw.line(screen, rand_color, (0, 0), (600, 400), 20)
          

          你真的不需要在 pygame 中使用它,这只是一个例子。我很确定你可以在 Python 的其余部分中做到这一点。

          【讨论】:

            【解决方案9】:

            取一个统一的随机变量作为RGB的值,可能会产生大量的灰、白、黑,这些往往不是我们想要的颜色。

            cv::applyColorMap可以轻松生成随机的RGB调色板,您可以从here列表中选择喜欢的颜色图

            C++11 示例:

            #include <algorithm>
            #include <numeric>
            #include <random>
            #include <opencv2/opencv.hpp>
            
            std::random_device rd;
            std::default_random_engine re(rd());
            
            // Generating randomized palette
            cv::Mat palette(1, 255, CV_8U);
            std::iota(palette.data, palette.data + 255, 0);
            std::shuffle(palette.data, palette.data + 255, re);
            cv::applyColorMap(palette, palette, cv::COLORMAP_JET);
            
            // ...
            
            // Picking random color from palette and drawing
            auto randColor = palette.at<cv::Vec3b>(i % palette.cols);
            cv::rectangle(img, cv::Rect(0, 0, 100, 100), randColor, -1);
            

            Python3 示例:

            import numpy as np, cv2
            
            palette = np.arange(0, 255, dtype=np.uint8).reshape(1, 255, 1)
            palette = cv2.applyColorMap(palette, cv2.COLORMAP_JET).squeeze(0)
            np.random.shuffle(palette)
            # ...
            
            rand_color = tuple(palette[i % palette.shape[0]].tolist())
            cv2.rectangle(img, (0, 0), (100, 100), rand_color, -1)
            

            如果你不需要那么多颜色,你可以把调色板剪成想要的长度。

            【讨论】:

              【解决方案10】:

              以 (r,b,g) 的形式输出,看起来像 (255,155,100)

              from numpy import random
              color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
              

              【讨论】:

                【解决方案11】:

                下面的解决方案是没有任何外部包

                import random
                
                def pyRandColor():
                    randNums = [random.random() for _ in range(0, 3)]
                
                    RGB255 = list([ int(i * 255) for i in randNums ])
                    RGB1 = list([ round(i, 2) for i in randNums ])
                    return RGB1
                

                示例用例:

                print(pyRandColor())
                # Output: [0.53, 0.57, 0.97]
                

                注意:

                • RGB255 返回 0 到 255 之间的 3 个整数列表
                • RGB1 返回 0 和 1 之间 3 位小数的列表

                【讨论】:

                  【解决方案12】:

                  您可以在这里使用%x 运算符加上randint 来生成颜色

                  colors_ = lambda n: list(map(lambda i: "#" + "%06x" % random.randint(0, 0xFFFFFF),range(n)))
                  

                  运行函数生成2种随机颜色:

                  colors_(2)
                  

                  输出 ['#883116', '#032a54']

                  【讨论】:

                    【解决方案13】:

                    试试这个代码

                    import numpy as np
                    
                    R=np.array(list(range(255))
                    G=np.array(list(range(255))
                    B=np.array(list(range(255))
                    np.random.shuffle(R)
                    np.random.shuffle(G)
                    np.random.shuffle(B)
                    def get_color():
                    
                        for i in range(255):
                             yield (R[i],G[i],B[i])
                    palette=get_color()
                    random_color=next(palette) # you can run this line 255 times 
                    

                    【讨论】:

                    • 虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。
                    【解决方案14】:

                    假设您有一个数据框,或者任何可以生成随机颜色或顺序颜色的数组,如下所示。

                    对于随机颜色(您可以选择要生成的每种随机颜色):

                    arraySize = len(df.month)
                    colors = ['', ] * arraySize
                    color = ["red", "blue", "green", "gray", "purple", "orange"]
                    for n in range(arraySize):
                        colors[n] = cor[random.randint(0, 5)]
                    

                    对于连续颜色:

                    import random    
                    arraySize = len(df.month)
                    colors = ['', ] * arraySize
                    color = ["red", "blue", "green", "yellow", "purple", "orange"]
                    i = 0
                    for n in range(arraySize):
                        if (i >= len(color)):
                            i = 0
                        colors[n] = color[i]
                        i = i+1
                    

                    【讨论】:

                      【解决方案15】:
                      import random
                      rgb_full=(random.randint(1,255), random.randint(1,255), random.randint(1,255))
                      

                      【讨论】:

                      • 您将此作为答案发布。默认情况下,作者的用户名添加在每个答案下方(除非它是社区 wiki)。说这是一个答案并且是你的答案是多余的。相反,including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
                      • 在任何情况下,random.randint(a,b) 从闭区间 [a,b] 中采样,即两端都包括在内,所以 random.randint(1,256) 是不正确的。
                      • 为什么要构造元组的字符串表示而不是实际的元组?
                      • (已编辑)在撰写本文时我不知道元组存在(我知道这听起来很愚蠢,哈哈)