首页 > 解决方案 > 在 pygame 中使用颜色查找表

问题描述

我在 pygame 中创建了一个查找颜色表(这里只是灰度级):

LUT = np.empty([256,3],np.uint8)
for gg in range(0,256):
    LUT[gg,:] = [gg,gg,gg]

然后我想调用这个查找表的每个值来填充来自 pygame 的 2D 矩阵的 3D 像素数组,例如使用噪声:

screenWidth = 800
screenHeight = 480
win = pygame.display.set_mode((screenWidth,screenHeight), 32)

buffer = pygame.surfarray.pixels3d(win)
I = (255*np.random.rand(screenWidth,screenHeight)).astype(int)
buffer = LUT[I,:]

从外观上看,一切似乎都是正确的,我得到了一个 3D 像素数组,每个值都是我所期望的。但是这个像素阵列没有显示在我创建的“win”窗口中(它仍然是黑色的)。令我困惑的是,如果我逐个元素填充相同的像素数组:

for rr in range(0,screenWidth):
        for cc in range(0,screenHeight):
            buffer[rr,cc,:] = LUT[I[rr,cc],:]

然后它工作正常,但速度要慢得多。我发现这两种技术填充的像素阵列之间没有区别(两者都是常规的 (800,480,3) unit8 阵列,正如我所期望的那样)。如果我用 matplotlib imshow 显示它们,这两种情况下的图像看起来都很好。有谁知道为什么?

标签: pythonpygame

解决方案


嵌套循环

for rr in range(0,screenWidth):
       for cc in range(0,screenHeight):
           buffer[rr,cc,:] = LUT[I[rr,cc],:]

可以替换为:

buffer[:,:,:] = LUT[I,:]

buffer = LUT[I,:]不会改变 的元素buffer。该语句生成一个新缓冲区并将新数组对象分配给变量buffer。的元素buffer必须通过切片设置(参见numpy - Basic Slicing and Indexing):

lutBuffer = LUT[I,:]
buffer[:,:,:] = lutBuffer

推荐阅读