如何将这个(100,100)numpy数组转换为pygame中的灰度精灵?

时间:2013-09-26 19:06:08

标签: python numpy pygame

我正在尝试制作一种称为Gabor补丁的特殊光栅,其示例可以在this tutorial的底部找到,其代码我移植到python。

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

虽然着色不同,但我怀疑这与matplotlib如何显示数值有关。本质上,此图像是一个2D,100×100像素的数组,包含-1.01.0(含)的值。如果有人想尝试操纵有问题的数组,我已将其保存为pickle对象here

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

  1. 着色转换为灰度着色( c.f。:第一个链接中的最后一个图像)
  2. 解决方案必须使用pygame版本1.9.1release。出于某种莫名其妙的原因,我找不到在我的操作系统上安装1.9.2的方法(Ubuntu 13.04)。在PIP上似乎没有PPA和pygame显然没有。
  3. 非常感谢您,如果我能提供更多信息,请告诉我!

    修改

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

    from matplotlib.pyplot import *
    import matplotlib.cm as cm
    
    figure()
    imshow(g, cm=cm.Greys_r)
    show()
    

    enter image description here

1 个答案:

答案 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()

你得到了

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。但是,如果您没有使用numpy导入IndexError: bytes to write exceed buffer size代码,则代码会中断。谢谢,numpy

...表示“此点之前的所有轴”,因此您可以将[3:2][:, 3:2][:, :, :, 3:2]替换为[..., 3:2] 。实际上,出于这个原因,...被引入Python。

Nonenumpy.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