python - 我如何将这个 (100, 100) numpy 数组转换为 pygame 中的灰度 Sprite ?

标签 python numpy pygame

我正在尝试制作一种特殊的光栅,称为 Gabor 贴片,可以在 this tutorial 的底部找到一个例子。我将其代码移植到了 python。

使用 matplotlib 的 imshow 函数,我获得了以下补丁。 python-generated Gabor patch displayed with matplotlib's imshow

虽然颜色不同,但我怀疑这与 matplotlib 显示数值的方式有关。从本质上讲,此图像是一个 100 x 100 像素的二维数组,包含从 -1.01.0(含)的值。如果有人想尝试操作有问题的数组,我已将其保存为 pickle 对象 here .

我的问题如下:如何在确保满足以下条件的同时将此数组传输到 pygame 表面?

  1. 着色转换为灰度着色(c.f.:第一个链接中的最后一张图片)
  2. 解决方案必须使用 pygame 版本 1.9.1release。由于某些莫名其妙的原因,我找不到在我的操作系统 (Ubuntu 13.04) 上安装 1.9.2 的方法。似乎没有 PPA,pygame 显然不在 PIP 上。

非常感谢您,如果我可以提供更多信息,请告诉我!

编辑

关于@Veedrac 的解决方案(与我自己的非常相似),这是我的补丁在 matplotlib 的 imshow 中使用灰度颜色图时的样子。这是我想要拥有的:

from matplotlib.pyplot import *
import matplotlib.cm as cm

figure()
imshow(g, cm=cm.Greys_r)
show()

enter image description here

最佳答案

import numpy
import pickle
import pygame

surface = pygame.Surface((100, 100))

获取像素,转换为RGBA。使用 Joe Kington 的提醒,数据范围从 -1 到 1:

base = (pickle.load(open("g.pickle"))+1)/2 * 255
base = base[..., numpy.newaxis].repeat(4, -1).astype("uint8")

复制数据

numpy_surface = numpy.frombuffer(surface.get_buffer())
numpy_surface[...] = numpy.frombuffer(base)
del numpy_surface

显示:

screen = pygame.display.set_mode((100, 100))
screen.blit(surface, (0, 0))
pygame.display.flip()

你得到

enter image description here


再次感谢 Joe Kington 的输入,使用 make_surface 进行了简化:

import numpy
import pickle
import pygame

base = (pickle.load(open("g.pickle"))+1) * 128
base = base[..., None].repeat(3, -1).astype("uint8")

surface = pygame.surfarray.make_surface(base)

screen = pygame.display.set_mode((100, 100))
screen.blit(surface, (0, 0))
pygame.display.flip()

base[..., None] 通常拼写为 base[..., numpy.newaxis],但这是 numpy 我只是“扩展了常量”以便不需要 numpy。但是,它不起作用,因为如果您不使用 IndexError: bytes to write exceed buffer size 导入 numpy,代码就会中断。谢谢,numpy

... 表示“该点之前所有轴的整体”,因此您可以替换 [3:2][: , 3:2][:, :, :, 3:2][..., 3:2]。事实上,正是出于这个原因,... 才被引入 Python。

Nonenumpy.newaxis 切片一个新轴 (duh)。例如,这会将 [a, b, c] 转换为 [[a], [b], [c]]。这是必需的,因为我们随后将沿着这个新轴重复

基本上,看一行,我们有

114, 202, 143, ...

我们想要

[114, 114, 114], [202, 202, 202], [143, 143, 143], ...

所以我们的[..., None]让我们做到了

[114], [202], [143], ...

我们只是在轴 -1重复 3 次。轴 -1 当然是最后一个轴,即 numpy.newaxis

关于python - 我如何将这个 (100, 100) numpy 数组转换为 pygame 中的灰度 Sprite ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19036565/

相关文章:

python - 从 Pandas 的日期时间变量中删除时间?

python - 清除 usr/lib/python3.5/site-packages/后 DNF 和 YUM 不工作

python - 关于Python动画的简单问题

python - 根据两个不同数组的值填充 Numpy 数组

python - 尝试在 pygame 的 for 循环中创建对象并得到 AttributeError : 'FoodItems' object has no attribute 'add_internal'

java - 如何像java一样格式化日期时间?

python - 字典的键的交集是什么

python - 如何向 numpy.ndarray 添加标签?

python - 属性错误 : type object 'Player' has no attribute 'image_dict'

python - [Python 2.7]使用pygame在窗口内输入shell?