11

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

使用 matplotlib 的imshow函数,我获得了以下补丁。python 生成的 Gabor 补丁与 matplotlib 的 imshow 一起显示

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

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

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

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

编辑

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

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

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

在此处输入图像描述

4

1 回答 1

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

你得到

在此处输入图像描述


再次感谢乔金顿的输入,简化了,使用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]和。实际上,正是出于这个原因才被引入 Python。[:, :, :, 3:2][..., 3:2]...

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

基本上,看一排,我们有

114, 202, 143, ...

我们想要

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

所以我们[..., None]让我们

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

我们只是repeat 3在轴上的时间-1。当然, Axis-1是最后一个轴,即numpy.newaxis.

于 2013-09-26T20:09:11.010 回答