生成随机颜色(RGB)

52

上周我在朋友的建议下开始学习Python图像处理,以生成随机颜色的图案。我在网上找到了这段脚本,可以在RGB光谱范围内生成各种不同的颜色。

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

我只是想将此脚本附加到仅生成三种随机颜色之一。最好是红色、绿色和蓝色。

16个回答

92

一种简洁的方法来生成在256(也称为8字节)范围内的RGB三元组是

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

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


16
应该这样写:color = list(np.random.random(size=3) * 256),意思是生成一个长度为3,元素随机取值在0到256之间的列表。 - Isilmë O.
7
没有使用np库的话,可以使用以下代码生成随机颜色:rand_color = random.choices(range(256), k=3)。其中,k=3表示生成三个随机数,每个数都在0-255之间。 - cuppajoeman
1
你可以使用元组:color = tuple(np.random.random(size=3) * 256) - Jeru Luke

64

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

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()

输入图像描述


8
为什么不直接从000000-FFFFFF的范围内随机选择颜色呢?例如,您可以使用以下代码:f"#{random.randrange(0x1000000):06x}" - ThePopMachine

27

在这里:

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

结果只可能是红、绿或蓝。然而该方法无法适用于其他颜色系列,你需要先建立一个包含想要选择的所有颜色的列表,然后使用random.choice随机选择其中的一个。


8

使用random.randint()函数:

from random import randint

r = randint(0, 255)
g = randint(0, 255)
b = randint(0, 255)
rand_color = (r, g, b)

您也可以使用random.randrange()来减少输入。

from random import randrange

r = randrange(255)
g = randrange(255)
b = randrange(255)
rand_color = (r, g, b)

你甚至可以使用一行代码来完成这个操作!

from random import randrange

rand_color = (randrange(255), randrange(255), randrange(255))

然后你可以用这个颜色做任何你想做的事情。其中一件事是使用随机颜色在pygame中创建形状。

from random import randrange
import pygame

rand_color = (randrange(255), randrange(255), randrange(255))

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

7
以下代码生成一个随机RGB颜色值(0-255,0-255,0-255)。
color = lambda : [random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]

2
嗨@Rahul,你能否给你的答案添加一些解释? - toti08
3
这个函数会返回一个由3个介于0到255之间的随机数所组成的数组,这三个数一起构成了RGB颜色规范。 - Harel

6
如果您不想从可能的256×256×256种颜色中采样颜色, 因为这种方式产生的颜色可能看起来不是"漂亮",其中许多颜色太暗或太白,那么您可能想从一个颜色映射中采样颜色。 cmapy 包包含了 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))

1
RGBA值应该在0-1范围内。 - Yu Da Chi

4

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

import random

COLORS = [(139, 0, 0), 
          (0, 100, 0),
          (0, 0, 139)]

def random_color():
    return random.choice(COLORS)

2
将均匀分布的随机变量作为RGB值可能会生成大量灰色、白色和黑色,这通常不是我们想要的颜色。 cv::applyColorMap 可以轻松生成随机的RGB调色板,您可以从 此处 的列表中选择喜欢的颜色映射。
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)

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

2
下面的解决方案不需要任何外部包。
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 返回一个由 3 个介于 0 和 255 之间的整数组成的列表
  • RGB1 返回一个由 3 个介于 0 和 1 之间的小数组成的列表

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接