11

ガボール パッチと呼ばれる特別な種類のグレーティングを作成しようとしています。その例は、Python に移植したコードのこのチュートリアルの下部にあります。

matplotlib のimshow関数を使用して、次のパッチを取得します。matplotlib の imshow で表示される Python 生成の Gabor パッチ

カラーリングは異なりますが、これは matplotlib が数値を表示する方法に関係していると思われます。-1.0本質的に、このイメージはから1.0(両端を含む)までの値を含む 2D の 100 行 100 列のピクセル配列です。誰かが問題の配列を操作してみたい場合は、ピクル オブジェクトhereとして保存しました。

私の質問は次のとおりです。次の条件が満たされていることを確認しながら、この配列を pygame サーフェスに転送するにはどうすればよいですか?

  1. 着色はグレースケールの着色に変換されます (参照: 最初のリンクの最後の画像)
  2. ソリューションは pygame version を採用する必要があります1.9.1release。なんらかの理由で1.9.2、OS (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 に変換します。データの範囲が -1 から 1 であるという Joe Kington のリマインダーを使用します。

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


また、ジョー・キングトンの入力のおかげで、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()

Theはbase[..., None]通常. base[..., numpy.newaxis]_ ただし、. でインポートしないとコードが壊れるため、機能しませんでした。ありがとうございます。numpynumpynumpyIndexError: bytes to write exceed buffer sizenumpy

は「この点より前のすべての軸全体」を意味するため、 、 、およびに...置き換えることができます。実際、まさにこの理由で Python が導入されました。[3:2][:, 3:2][:, :, :, 3:2][..., 3:2]...

Noneまたはnumpy.newaxisは、新しい軸をスライスします (当然)。これは、たとえばに変換[a, b, c]されます。[[a], [b], [c]]これが必要なのは、repeatこの新しい軸に沿っているからです。

基本的に、1行を見ると、

114, 202, 143, ...

そして私たちは欲しい

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

だから私たち[..., None]は私たちを手に入れました

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

そしてrepeat 3、 axis の時間だけ-1です。もちろん、 Axis-1は最後の軸であり、numpy.newaxis.

于 2013-09-26T20:09:11.010 に答える