4

画像の上半分のピクセル値を黒に変更できるように、グレースケール画像を変更したいと思います。私は確かに次のように通常の方法で繰り返すことによってこれを行うことができます:

for i in range(0,rows):
  for j in range(0,cols):
    if(condition)
      image[i,j] = 0;

しかし、私はビデオ処理をしなければならないので、これはかなり遅いです。使用する必要があることはわかりImage.point()ますが、実装方法がわかりません。誰かがこれで私を助けることができますか?

4

2 に答える 2

9

最初にPILイメージをnumpy配列に変換すると、これははるかに高速になります。値が10未満のすべてのピクセルをゼロにする方法は次のとおりです。

>>> import numpy as np
>>> arr = np.array(img)
>>> arr[arr < 10] = 0
>>> img.putdata(arr)

または、コメントで述べたように、画像の上半分を黒く塗りつぶします。

>>> arr[:arr.shape[0] / 2,:] = 0

最後に、ビデオ処理を行っているので、個々のフレームをループする必要もないことに注意してください。4x4画像のフレームが10個あるとします。

>>> arr = np.ones((10,4,4)) # 10 all-white frames
>>> arr[:,:2,:] = 0         # black out the top half of every frame
>>> a
array([[[ 0.,  0.,  0.,  0.],
    [ 0.,  0.,  0.,  0.],
    [ 1.,  1.,  1.,  1.],
    [ 1.,  1.,  1.,  1.]],

   [[ 0.,  0.,  0.,  0.],
    [ 0.,  0.,  0.,  0.],
    [ 1.,  1.,  1.,  1.],
    [ 1.,  1.,  1.,  1.]],
...
于 2012-11-19T20:08:06.310 に答える
0

これは、画像をマルチプロセッシングするのに非常に適した候補です。画像をピクセルのブロックに分割すると、画像を非常に簡単に並列処理できます。つまり、画像が十分に大きい場合、または多くの画像でこれを実行している場合です。

  1. 画像をタプルとして定義されたチャンクに分割します(左上のX、左上のY、幅、高さ)
  2. タプルとイメージハンドルをさまざまなスレッドに渡します。できればスレッドプールに入れます。
  3. スレッドが終了するのを待ってから、イメージの使用を続行します。

これは、画像サイズ、スレッド数とブロックサイズの選択に応じて、当然のことながらプロセスを直線的にスピードアップできます。

于 2012-11-19T20:08:17.337 に答える