4

として保存されている画像がありndarrayます。この配列の各ピクセルを反復処理したいと思います。

次のように、配列の各要素を反復処理できます。

from scipy import ndimage
import numpy as np

l = ndimage.imread('sample.gif', mode="RGB")

for x in np.nditer(l):
    print x

これにより、次のようになります。

...
153
253
153
222
253
111
...

これらは、ピクセル内の各色の値です。私が代わりに望むのは、これらの値を 3 つずつ読み取って、次のようなものを生成することです。

...
(153, 253, 153)
(222, 253, 111)
...
4

3 に答える 3

3

おそらく最も簡単な方法は、最初に numpy 配列を再形成してから、印刷を開始することです。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

また、これはあなたを助けるはずです。 Pythonでnumpy配列を再形成する

于 2015-01-27T16:22:28.060 に答える
3

リストをそれ自体で圧縮してみることができます:

from itertools import izip
for x in izip(l[0::3],l[1::3],l[2::3]):
    print x

出力:

(153, 253, 153)
(222, 253, 111)

更新:ウェルプ、2015年はnumpyが苦手でした。これが私の更新された答えです:

scipy.ndimage.imreadは現在非推奨であり、使用することをお勧めしますimageio.imread。ただし、この質問の目的のために、両方をテストしましたが、同じように動作します。

as で画像を読み取っているので、すでに必要なRGBの配列を取得しheightxwidthx3ます。で配列を反復処理すると、形状が失われますnp.nditer

>>> img = imageio.imread('sample.jpg')
>>> img.shape
(456, 400, 3)
>>> for r in img:
...     for s in r:
...         print(s)
... 
[63 46 52]
[63 44 50]
[64 43 50]
[63 42 47]
...
于 2015-01-27T16:32:48.397 に答える
1

答え@Imranは機能しますが、直感的な解決策ではありません...これにより、デバッグが難しくなる可能性があります。個人的には、画像の操作を避けてから、for ループで処理します。

代替案 1:

img = ndimage.imread('sample.gif')
rows, cols, depth = np.shape(img)

r_arr, c_arr = np.mgrid[0:rows, 0:cols]

for r, c in zip(r_arr.flatten(), c_arr.flatten()):
    print(img[r,c])

または、ネストされた for ループを使用して直接これを行うこともできます。

for row in img:
    for pixel in row:
        print(pixel)

これらは柔軟であることに注意してください。深度に関係なく、あらゆる 2D 画像で機能します。

于 2015-03-09T18:14:25.207 に答える