3

PIL と python を使用して色のグリッドを構築しようとしているときに、イライラする問題に遭遇しました。グリッドをループして色を抽出することはできますが、それらを読み返すと、何らかの理由でそれらの 1 つ以上が常に消えてしまいます。これは信じられないほど基本的なエラーのように思えますが、非常に苛立たしいものです。

これが問題のコードです。cx と cy は、グリッド内の各サンプル ポイントの中心を指すだけで、色はサンプル領域で最も使用される色です。

image = ImageGrab.grab(box)
matrix = [[None] * ROWS] * COLS

c1 = set()
for row in range(ROWS):
    for col in range(COLS):
        cx = (col * CELLW) + int(CELLW / 2)
        cy = (row * CELLH) + int(CELLH / 2)
        sample_box = (cx - SAMPLE_SIZE, cy - SAMPLE_SIZE, cx + SAMPLE_SIZE, cy + SAMPLE_SIZE)
        sample = image.crop(sample_box)
        color = sorted(sample.getcolors())[-1][1]    
        matrix[col][row] = color
        c1.add(color)
print(c1)

c2 = set()
for row in range(ROWS):
    for col in range(COLS): 
        c2.add(matrix[col][row])
print(c2)

ご覧のとおり、(私が思うに) 起こるべきことは、 c1 がすべての一意の色を保持し、それらを印刷することです。次に、 c2 は同じことをループし、一意の色も印刷します。なぜ違うのかわかりませんが、違うのです。

出力は次のようになります。

{(240, 240, 240), (255, 255, 255), (252, 252, 252)}
{(240, 240, 240), (255, 255, 255)}

この苛立たしい問題の助けをいただければ幸いです

4

1 に答える 1

1

ここでの問題は、マトリックスが同じリストへの複数の参照を保持していることだと思います。検討:

>>> matrix = [[None]*3]*4
>>> matrix
[[None, None, None], [None, None, None], [None, None, None], [None, None, None]]
>>> matrix[1][1]=0
>>> matrix
[[None, 0, None], [None, 0, None], [None, 0, None], [None, 0, None]]

「マトリックス」を次のように初期化することで、これを回避できます。

matrix = [[None]*ROWS for _ in range(COLUMNS)] 

必要に応じて、python 2.xで使用できますxrange...

于 2012-09-05T13:25:29.790 に答える