python - 在 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 显示它们,这两种情况下的图像看起来都很好。有谁知道为什么?
解决方案
嵌套循环
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
推荐阅读
- javascript - 在折线图中创建圆角 [vue-chart.js]
- sql - Oracle - 如何根据某个值更改字段值
- docker - 在 Raku 中通过 NativeCall 调用 GSL 函数会引发错误
- javascript - selenium如何运行一个javascript函数
- apache-kafka - 如何从具有特定偏移量的 kafka 主题获取消息
- angular - 是否可以将 @ContentChild 和 @ContentChildren 用于投影的 DOM 元素?
- angular - Stackblitz 简单 MatDialog 示例无法找到 ComponentFactory
- html - css-grid-gallery-img-description-more 文本管理
- javascript - 遍历 NodeList
- json - Power bi:导入嵌套 json 查询