从色彩直方图生成随机图片的最快方法是什么?

3
假设我有一个颜色直方图。在Python中是否有一种巧妙的方法可以从颜色直方图生成随机图像?
更具体地说,我想根据颜色直方图的分布为每个像素生成随机颜色。
谢谢!

你的直方图格式是什么?我的意思是你能否展示一下存储方式并且给出一个例子? - Mark Setchell
2个回答

4

numpy.random.choice

以下是来自链接文档的参数:

a : 1-D 数组或 int

如果是一个 ndarray,则从其元素中生成随机样本。 如果是 int,则生成的随机样本就像 a 是 np.arange(a) 一样。

size : int 或者 int 元组,可选

输出形状。 如果给定的形状为 (m, n, k),则会抽取 m * n * k 个样本。默认值为 None,此时返回单个值。

replace : boolean,可选

样本是否带或不带替换

p : 1-D 数组或类似数组,可选

a 中每个条目相关联的概率。 如果未给出,则假定样本在 a 的所有条目上具有均匀分布。


参数 shape 应该是您的图像大小,例如 (100,100)。 参数 a 应该是分布,参数 p 应该是由直方图生成的分布。

例如:

import numpy as np
bins = np.array([0,0.5,1])
freq = np.array([1.,2,3])
prob = freq / np.sum(freq)
image = np.random.choice(bins, size=(100,100), replace=True, p=prob)
plt.imshow(image)

收益率

随机图片


为了支持多个颜色通道,您有几个选择。这里是其中之一,我们从颜色索引中选择而不是颜色本身:

colors = np.array([(255.,0,0), (0,255,0), (0,0,255)])
indices = np.array(range(len(colors)))
im_indices = np.random.choice(indices, size=(100,100), p=prob)
image = colors[im_indices]

谢谢您的回答。不过我还有一个问题,对于彩色图像,我们如何生成颜色直方图?由于有三个通道,我们如何将颜色范围压缩成一维? - jack
@jack 这个回答解决了你的问题吗? - en_Knight
谢谢回答。我想我明白了,但是生成一个形状为(255,255,255)的颜色空间的代码不正确。 - jack
不,那是一个由三种颜色组成的数组(分别是红、绿和蓝),只是作为一个示例。在前面的例子中,[0,.5,1] 对应于 3 种灰度颜色。我假设频率与上一个例子相同。然后,图像是根据这三种颜色的直方图采样的一个 100x100 的图像。这有意义吗? - en_Knight
哦,我明白了!那很有道理。但是我之前问的后续问题实际上是如何生成这样的颜色直方图。因此,对于一个RGB图像,我想要一个看起来像{color1: 0.01, color2: 0.1,..... color100:0.04}的直方图,其中colorxxx是代表具有形状(256,256,3)的bin的颜色。但是你的答案已经回答了我之前问的问题,所以我会将其选为已回答。谢谢。 - jack
显示剩余3条评论

1

random.choices 可以从加权种群中选择元素。例如:

>>> import random
>>> histogram = {"white": 1, "red": 5, "blue": 10}
>>> pixels = random.choices(list(histogram.keys()), list(histogram.values()), k=25)
>>> pixels
['blue', 'red', 'red', 'red', 'blue', 'red', 'red', 'white', 'blue', 'white', 'red', 'red', 'blue', 'red', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue']

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