为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用numpy创建具有N种颜色的离散RGB色彩图

如何使用numpy创建具有N种颜色的离散RGB色彩图

慕的地8271018 2021-03-29 13:10:48
我正在尝试使用RGB三元组创建一个非常简单的色彩图。那有离散数量的颜色。这是我尝试使其遵循的形状:我知道这可能不是真正的RGB光谱,但我希望它尽可能容易计算。我希望能够生成沿着行均匀分布的N个8位RGB元组的数组。对于上面图像中所有点都是彩色的简单实例,可以numpy.linspace()使用以下代码轻松生成:import numpy as np# number of discrete coloursN = 9# generate R arrayR = np.zeros(N).astype(np.uint8)R[:int(N/4)] = 255R[int(N/4):int(2*N/4)+1] = np.linspace(255,0,num=(N/4)+1,endpoint=True)# generate G arrayG = 255*np.ones(N).astype(np.uint8)G[0:int(N/4)+1] = np.linspace(0,255,num=(N/4)+1,endpoint=True)G[int(3*N/4):] = np.linspace(255,0,num=(N/4)+1,endpoint=True)# generate B arrayB = np.zeros(N).astype(np.uint8)B[int(2*N/4):int(3*N/4)+1] = np.linspace(0,255,num=(N/4)+1,endpoint=True)B[int(3*N/4)+1:] = 255# stack arraysRGB = np.dstack((R,G,B))[0]该代码适用于5种颜色:r   255 255 0   0   0g   0   255 255 255 0b   0   0   0   255 2559种颜色:r   255 255 255 127 0   0   0   0   0g   0   127 255 255 255 255 255 127 0b   0   0   0   0   0   127 255 255 25513种颜色:r   255 255 255 255 170 85  0   0   0   0   0   0   0g   0   85  170 255 255 255 255 255 255 255 170 85  0b   0   0   0   0   0   0   0   85  170 255 255 255 255等。但是我在解决如何使其适用于任意N种颜色方面遇到了麻烦,因为linspace技巧仅在从一个端点到另一个端点时才起作用。有人可以帮我解决该怎么做吗?关于如何使我的代码更高效的任何想法也将是不错的选择,我只是在学习了numpy一段时间后才开始使用numpy。
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

这是使用以下一种相当方便的方法np.clip:


def spec(N):                                             

    t = np.linspace(-510, 510, N)                                              

    return np.round(np.clip(np.stack([-t, 510-np.abs(t), t], axis=1), 0, 255)).astype(np.uint8)

通过仅依赖保证在任何N上的网格中仅有的两个点(第一个点和最后一个点),它避免了您描述的问题。


例子:


>>> spec(5)

array([[255,   0,   0],

       [255, 255,   0],

       [  0, 255,   0],

       [  0, 255, 255],

       [  0,   0, 255]], dtype=uint8)

>>> spec(10)

array([[255,   0,   0],

       [255, 113,   0],

       [255, 227,   0],

       [170, 255,   0],

       [ 57, 255,   0],

       [  0, 255,  57],

       [  0, 255, 170],

       [  0, 227, 255],

       [  0, 113, 255],

       [  0,   0, 255]], dtype=uint8)


查看完整回答
反对 回复 2021-04-13
?
函数式编程

TA贡献1807条经验 获得超9个赞

如果您只想要给定级别的RGB,则您自己发布的图表可以作为答案-


R = [255] * 256

R.extend(list(reversed(range(256))))

R.extend([0] * 256)

R.extend([0] * 256)


G = list(range(256))

G.extend([255] * 256)

G.extend([255] * 256)

G.extend(list(reversed(range(256))))


B = [0] * 256

B.extend([0] * 256)

B.extend(list(range(256)))

B.extend([255] * 256)


level = 5

step = 1024 // (level -1)


print(R[::step])

print(G[::step])

print(B[::step])


查看完整回答
反对 回复 2021-04-13
  • 2 回答
  • 0 关注
  • 384 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号