我正在尝试制作一种称为Gabor补丁的特殊光栅,其示例可以在this tutorial的底部找到,其代码我移植到python。
使用matplotlib的imshow
函数,我获得了以下补丁。
虽然着色不同,但我怀疑这与matplotlib如何显示数值有关。本质上,此图像是一个2D,100×100像素的数组,包含-1.0
到1.0
(含)的值。如果有人想尝试操纵有问题的数组,我已将其保存为pickle对象here。
我的问题如下:如何在确保满足以下条件的同时将此数组传输到pygame表面?
1.9.1release
。出于某种莫名其妙的原因,我找不到在我的操作系统上安装1.9.2
的方法(Ubuntu 13.04)。在PIP上似乎没有PPA和pygame显然没有。非常感谢您,如果我能提供更多信息,请告诉我!
修改
关于@ Veedrac的解决方案(与我自己非常相似),这是在matplotlib的imshow
中使用灰度色彩图时我的补丁的样子。这是我希望拥有的内容:
from matplotlib.pyplot import *
import matplotlib.cm as cm
figure()
imshow(g, cm=cm.Greys_r)
show()
答案 0 :(得分:6)
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
。但是,如果您没有使用numpy
导入IndexError: bytes to write exceed buffer size
代码,则代码会中断。谢谢,numpy
。
...
表示“此点之前的所有轴”,因此您可以将[3:2]
,[:, 3:2]
和[:, :, :, 3:2]
替换为[..., 3:2]
。实际上,出于这个原因,...
被引入Python。
None
或numpy.newaxis
切片新轴(duh)。例如,这会将[a, b, c]
转换为[[a], [b], [c]]
。这是必要的,因为我们沿着这个新轴repeat
。{/ p>
基本上,看一行,我们有
114, 202, 143, ...
我们想要
[114, 114, 114], [202, 202, 202], [143, 143, 143], ...
所以我们的[..., None]
让我们
[114], [202], [143], ...
我们在repeat
轴上只有3
-1
次。轴-1
当然是最后一个轴,即numpy.newaxis
。