2

多次元配列を扱うのはこれが初めてで、要素へのアクセスに問題があります。写真の赤いピクセルを取得しようとしていますが、配列内の最初の 8 つの要素だけです。これがコードです

import Image
import numpy as np

im = Image.open("C:\Users\Jones\Pictures\1.jpg")
pix = im.load() 

r, g, b = np.array(im).T
print r[0:8]
4

5 に答える 5

3

画像を扱っているので、rは2次元配列です。画像の最初の8ピクセルを取得するには、

r.flatten()[:8]

最初の行のピクセル数が8未満の場合、これは自動的に折り返されます。

于 2013-02-17T04:30:33.140 に答える
1

あなたはこのようにそれを行うことができます:

r[0][:8]

ただし、最初の行のピクセル数が8未満の場合、これは機能しないことに注意してください。これを修正するには、次のようにします。

from itertools import chain
r = list(chain.from_iterable(r))
r[:8]

importまたは(モジュール全体を作成したくない場合):

r = [val for element in r for val in element]
r[:8]
于 2013-02-17T04:35:01.500 に答える
1

すべての行も必要ですか?これを試してr[:,:8]

最初の行のみが必要ですか?これを試してr[0,:8]

于 2013-02-17T04:39:59.800 に答える
1

もっとシンプルにできると思います。この例では、ランダム マトリックスを使用します (これがユーザーのrマトリックスになります)。

In [7]: from pylab import *                 # convention

In [8]: r = randint(0,10,(10,10))           # this is your image

In [9]: r
array([[7, 9, 5, 5, 6, 8, 1, 4, 3, 4],
       [5, 4, 4, 4, 2, 6, 2, 6, 4, 2],
       [1, 4, 9, 9, 2, 6, 1, 9, 0, 6],
       [5, 9, 0, 7, 9, 9, 5, 2, 0, 7],
       [8, 3, 3, 9, 0, 0, 5, 9, 2, 2],
       [5, 3, 7, 8, 8, 1, 6, 3, 2, 0],
       [0, 2, 5, 7, 0, 1, 0, 2, 1, 2],
       [4, 0, 4, 5, 9, 9, 3, 8, 3, 7],
       [4, 6, 9, 9, 5, 9, 3, 0, 5, 1],
       [6, 9, 9, 0, 3, 4, 9, 7, 9, 6]])

次に、最初の8列を抽出して何かをします

In [17]: r_8 = r[:,:8]              # extract columns

In [18]: r_8
Out[18]: 
array([[7, 9, 5, 5, 6, 8, 1, 4],
       [5, 4, 4, 4, 2, 6, 2, 6],
       [1, 4, 9, 9, 2, 6, 1, 9],
       [5, 9, 0, 7, 9, 9, 5, 2],
       [8, 3, 3, 9, 0, 0, 5, 9],
       [5, 3, 7, 8, 8, 1, 6, 3],
       [0, 2, 5, 7, 0, 1, 0, 2],
       [4, 0, 4, 5, 9, 9, 3, 8],
       [4, 6, 9, 9, 5, 9, 3, 0],
       [6, 9, 9, 0, 3, 4, 9, 7]])

In [19]: r_8 = r_8 * 2              # do something

In [20]: r_8
Out[20]: 
array([[14, 18, 10, 10, 12, 16,  2,  8],
       [10,  8,  8,  8,  4, 12,  4, 12],
       [ 2,  8, 18, 18,  4, 12,  2, 18],
       [10, 18,  0, 14, 18, 18, 10,  4],
       [16,  6,  6, 18,  0,  0, 10, 18],
       [10,  6, 14, 16, 16,  2, 12,  6],
       [ 0,  4, 10, 14,  0,  2,  0,  4],
       [ 8,  0,  8, 10, 18, 18,  6, 16],
       [ 8, 12, 18, 18, 10, 18,  6,  0],
       [12, 18, 18,  0,  6,  8, 18, 14]])

さて、これがコツです。rを使用して最初の 8 列を置き換えますhstack

In [21]: r = hstack((r_8, r[:,8:]))             # it replaces the FISRT 8 columns, note the indexing notation 

In [22]: r
Out[22]: 
array([[14, 18, 10, 10, 12, 16,  2,  8,  3,  4],    # it does not touch the last 2 columns
       [10,  8,  8,  8,  4, 12,  4, 12,  4,  2],
       [ 2,  8, 18, 18,  4, 12,  2, 18,  0,  6],
       [10, 18,  0, 14, 18, 18, 10,  4,  0,  7],
       [16,  6,  6, 18,  0,  0, 10, 18,  2,  2],
       [10,  6, 14, 16, 16,  2, 12,  6,  2,  0],
       [ 0,  4, 10, 14,  0,  2,  0,  4,  1,  2],
       [ 8,  0,  8, 10, 18, 18,  6, 16,  3,  7],
       [ 8, 12, 18, 18, 10, 18,  6,  0,  5,  1],
       [12, 18, 18,  0,  6,  8, 18, 14,  9,  6]])
于 2013-02-17T05:28:37.510 に答える
0

編集: DSM が指摘したことに関しては、OP は実際にはnumpy arrayを使用しています。

nneonneo の正しいとして、私は私の答えを撤回します。

于 2013-02-17T05:04:56.973 に答える