我正在尝试制作一种特殊的光栅,称为 Gabor 贴片,可以在 this tutorial 的底部找到一个例子。我将其代码移植到了 python。
使用 matplotlib 的 imshow
函数,我获得了以下补丁。
虽然颜色不同,但我怀疑这与 matplotlib 显示数值的方式有关。从本质上讲,此图像是一个 100 x 100 像素的二维数组,包含从 -1.0
到 1.0
(含)的值。如果有人想尝试操作有问题的数组,我已将其保存为 pickle 对象 here .
我的问题如下:如何在确保满足以下条件的同时将此数组传输到 pygame 表面?
- 着色转换为灰度着色(c.f.:第一个链接中的最后一张图片)
- 解决方案必须使用 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()
最佳答案
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()
你得到
再次感谢 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。
None
或 numpy.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/