2014-07-15 82 views
0

我正在學習Python,我正試圖在PIL中解決以下問題。 我假設這將是直截了當的,但從外觀看,它不是。 因此,我正在加載圖像,將像素元組分配給列表,並對每個像素元組(RGB)執行一些基本計算。 我已經想通了。不過,我想結果值分配給另一個列表,並嘗試這樣做,將返回以下類型的錯誤:PIL處理 - 輸入錯誤

TypeError: list indices must be integers, not tuple

雖然我理解的不匹配,我真的不知道如何解決它,並正確地分配得到的每個像素的RGB值。我有這種應該是基本的討厭的感覺。

預先感謝您

i = Image.open("bike.jpg") 
newpixels = [] 

pixels = i.load() 
width, height = i.size 
for x in range(width): 
    for y in range(height): 
     cpixel = pixels[x, y] 
     rc = cpixel[0] 
     gc = cpixel[1] 
     bc = cpixel[2] 

     if rc < 128: 
      newR = 0 
     else: 
      newR = 1 

     if gc < 128: 
      newG = 0 
     else: 
      newG = 1 


     if bc < 128: 
      newB = 0 
     else: 
      newB = 1 

     newpixels[x,y] = (newR, newG, newB) 

回答

0

Python列表不喜歡這個工作。這種方式沒有像二維列表那樣的東西:而是使用列表列表。所以你需要逐行建立你的新版本。

newpixels = [] 
for x in range(width): 
    newrow = [] 
    for y in range(height): 
     ... code here ... 
     newrow.append((newR, newG, newB)) 
    newpixels.append(newrow) 
+0

有趣!看起來我必須遵循將圖像分解爲像素元組的反向路徑。我會給它一個去看看我能否得到它的工作。很多thanx的幫助:) – dascomp

0

您正在嘗試使用[x, y]索引爲newpixel,它被定義爲一個普通的Python列表:

newpixels = [] 

Python列表只能與一個整數值(如newpixels[idx])進行索引。 PIL的像素數據對象允許使用[x, y]表示法進行索引,但它不是普通的Python list

我不知道你想要做什麼,但如果你想要的是創造新的圖像,只需創建一個空白圖像與正確的大小,並改變它的像素數據:

如此變化:

newpixels = [] 

new_img = Image.new('RGB', i.size) 
newpixels = new_img.load() 

然後圖像處理的結果將是new_img

+0

Thanx爲您解釋重新PIL對象。我只是試圖找到PIL的方式,所以我可以自信地讀取每個像素的RGB值,進行一些計算,然後將每個像素的新值替換爲舊值。 – dascomp