7

その一部が画像ソースを読み取り、ユーザーが操作できるように画面に表示するコードを書いています。シャープ化された画像データも必要です。以下を使用してデータを読み取り、表示しますpyGame

def image_and_sharpen_array(file_name):
    #read the image data and return it, with the sharpened image
    image = misc.imread(file_name)

    blurred = ndimage.gaussian_filter(image,3)
    edge = ndimage.gaussian_filter(blurred,1)
    alpha = 20
    out = blurred + alpha*(blurred - edge)
    return image,out

#get image data
scan,sharpen = image_and_sharpen_array('foo.jpg')
w,h,c = scan.shape


#setting up pygame
pygame.init()
screen = pygame.display.set_mode((w,h))

pygame.surfarray.blit_array(screen,scan)
pygame.display.update()

そして、画像は回転と反転のみで画面に表示されます。misc.imreadこれはとの違いによるものpyGameですか? または、これは私のコードに何か問題があるためですか?

これを行う他の方法はありますか?私が読んだ解決策の大部分は、図を保存してから ``pyGame'' でそれを読むことでした。

4

4 に答える 4

1

すべてのライブラリには、画像配列を解釈する独自の方法があります。「回転」とは、転置を意味すると思います。これが、PyGame が numpy 配列を表示する方法です。「正しく」見えるようにする方法はたくさんあります。実際には、配列を表示する方法もたくさんあります。これにより、チャネル表現などを完全に制御できます。pygame バージョン 1.9.2 では、これは私がこれまで達成できた最速の配列レンダリングです。(以前のバージョンでは、これは機能しないことに注意してください!)。この関数は、サーフェスを配列で埋めます:

def put_array(surface, myarr):          # put array into surface
    bv = surface.get_view("0")
    bv.write(myarr.tostring())

それが機能しない場合は、これを使用してください。どこでも機能するはずです:

# put array data into a pygame surface
def put_arr(surface, myarr):
    bv = surface.get_buffer()
    bv.write(myarr.tostring(), 0)

あなたはおそらくあなたが望むものをまだ得ていないので、転置されているか、カラーチャンネルが交換されています. アイデアは、このサーフェス バッファに適した形式で配列を管理することです。正しいチャネル順序と軸順序を調べるには、openCVライブラリ (cv2.imread(filename)) を使用します。openCV では標準で BGR 順に画像を開き、多くの変換機能を備えています。私の記憶が正しければ、サーフェス バッファに直接書き込む場合、24 ビットでは BGR が正しい順序であり、32 ビット サーフェスでは BGRA が正しい順序です。したがって、この関数を使用してファイルから取得した画像配列を配置して、画面にブリットすることができます。

配列を描画する方法は他にもあります。たとえば、ここにヘルパー関数のセット全体があり ますhttp://www.pygame.org/docs/ref/surfarray.html
おそらく参照で失われます。ちょっとしたヒント: 「シグナリング テスト」を行うには、次のような画像を使用します。そのため、何か問題があるかどうかをすぐに確認できます。配列としてロードして、レンダリングを試みてください。

ここに画像の説明を入力

于 2015-06-21T23:57:58.013 に答える
1

私の提案は、pygame.transformモジュールを使用することです。flipおよびメソッドがありrotate、変換に使用できます。これに関するドキュメントを調べてください。

私の推奨は、出力画像を新しい に保存してからSurface、変換を適用し、ディスプレイにブリットすることです。

temp_surf = pygame.Surface((w,h))
pygame.surfarray.blit(temp_surf, scan)

'''transform temp_surf'''

screen.blit(temp_surf, (0,0))

これがなぜなのかわかりません。おそらく、軸が 2D 配列から pygame に転送される順序と関係がありSurfaceます。

于 2015-06-16T00:07:46.437 に答える