2013-07-24 42 views
18

私はいくつかのコンピュータビジョンアルゴリズムに取り組んでいます。私は各ステップでどのようにnumpy配列が変化するかを示したいと思います。matplotlibのimshow()ウィンドウをインタラクティブに更新するには?

私のコードの最後に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。 dynamic image exampleのようなアニメーション機能でこれを行うことは可能ですか?ループの中で関数を呼びたいので、アニメーション関数でどのようにこれを実現するのか分かりません。

+1

をそれは 'の前に)(あなたが使用してバックエンドいるに依存するが、少なくとも一つの'ショーを() 'を呼び出すしてみてくださいまたは'引いてもよいですあなたのループを開始 - この[回答](http://stackoverflow.com/questions/2130913/no-plot-window-in-matplotlib)を参照してください。 – Bonlenfum

答えて

24

いつもimshowに電話する必要はありません。

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

draw()は、バックエンドが画像を更新していることを確認する必要があります:それは、オブジェクトのset_dataメソッドを使用することがはるかに高速です。

更新日:あなたの質問は大幅に変更されました。そのような場合は、別の質問をすることをお勧めします。

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) 
+0

残念ながら、それは動作しません、同じことが起こります。たぶん私は、動的イメージの例のようなアニメーション関数を使用する必要があります:http://matplotlib.org/examples/animation/dynamic_image.htmlしかし、私はどのようにループベースのコードに変換することができますかわからない。 – zsero

+0

@zsero:より単純なバージョンが動作しない場合、より複雑なアニメーションが機能するかどうかは疑問です。私はちょうど私のために働く例を追加しました(matplotlib 1.2)、それがあなたのために働くか見てください。 – tiago

+1

あなたの例を変更しようとしましたが、 'im = imshow(data、...)'は 'im = plt.imshow(data、...)'と読みます。また、アニメーションを実行するには 'plt.show()'が必要です。乾杯。 – Chrigi

0

あなたの必要性に合った便利なスクリプトを実装しました。 here

ダイナミックな正弦波描く例、それを試してみてください:

import numpy as np 

def redraw_fn(f, axes): 
    amp = float(f)/3000 
    f0 = 3 
    t = np.arange(0.0, 1.0, 0.001) 
    s = amp * np.sin(2 * np.pi * f0 * t) 
    if not redraw_fn.initialized: 
    redraw_fn.l, = axes.plot(t, s, lw=2, color='red') 
    redraw_fn.initialized = True 
    else: 
    redraw_fn.l.set_ydata(s) 

redraw_fn.initialized = False 

videofig(100, redraw_fn) 
関連する問題