53

私はいくつかのコンピューター ビジョン アルゴリズムに取り組んでおり、numpy 配列が各ステップでどのように変化するかを示したいと思います。

コードの最後に単純なものがある場合imshow( array )、ウィンドウが表示され、最終的な画像が表示されるようになりました。

しかし、私がやりたいことは、反復ごとに画像が変化するときに imshow ウィンドウを更新して表示することです。

たとえば、私はやりたい:

import numpy as np
import matplotlib.pyplot as plt
import time

array = np.zeros( (100, 100), np.uint8 )

for i in xrange( 0, 100 ):
    for j in xrange( 0, 50 ):
        array[j, i] = 1

        #_show_updated_window_briefly_
        plt.imshow( array )
        time.sleep(0.1)

問題は、この方法では、Matplotlib ウィンドウがアクティブ化されず、計算全体が終了したときにのみアクティブになることです。

ネイティブの matplotlib と pyplot の両方を試しましたが、結果は同じです。コマンドをプロットするために.ion()スイッチを見つけましたが、ここでは機能していないようです。

Q1. numpy 配列 (実際には uint8 グレースケール画像) への更新を継続的に表示する最良の方法は何ですか?

Q2. 動画の例のように、アニメーション機能でこれを行うことは可能ですか? ループ内で関数を呼び出したいのですが、アニメーション関数でこれを実現する方法がわかりません。

4

6 に答える 6

52

imshowずっと電話する必要はありません。set_dataオブジェクトのメソッドを使用する方がはるかに高速です。

myobj = imshow(first_image)
for pixel in pixels:
    addpixel(pixel)
    myobj.set_data(segmentedimg)
    draw()

draw()、バックエンドがイメージを更新することを確認する必要があります。

更新:あなたの質問が大幅に変更されました。そのような場合は、別の質問をすることをお勧めします。2番目の質問に対処する方法は次のとおりです。

Matplotlib のアニメーションは、1 つの増加する次元 (時間) のみを処理するため、二重ループは実行されません。インデックスを単一のインデックスに変換する必要があります。次に例を示します。

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

nx = 150
ny = 50

fig = plt.figure()
data = np.zeros((nx, ny))
im = plt.imshow(data, cmap='gist_gray_r', vmin=0, vmax=1)

def init():
    im.set_data(np.zeros((nx, ny)))

def animate(i):
    xi = i // ny
    yi = i % ny
    data[xi, yi] = 1
    im.set_data(data)
    return im

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=nx * ny,
                               interval=50)
于 2013-07-24T14:53:34.590 に答える
3

ニーズに合った便利なスクリプトを実装しました。ここで試してみてください

カスタム ディレクトリ内の画像を表示する例は次のとおりです。

  import os
  import glob
  from scipy.misc import imread

  img_dir = 'YOUR-IMAGE-DIRECTORY'
  img_files = glob.glob(os.path.join(video_dir, '*.jpg'))

  def redraw_fn(f, axes):
    img_file = img_files[f]
    img = imread(img_file)
    if not redraw_fn.initialized:
      redraw_fn.im = axes.imshow(img, animated=True)
      redraw_fn.initialized = True
    else:
      redraw_fn.im.set_array(img)
  redraw_fn.initialized = False

  videofig(len(img_files), redraw_fn, play_fps=30)
于 2017-05-10T06:44:51.170 に答える