2014-02-19 59 views
3

我運行此代碼如何從位圖圖像的RGB值獲取數組?

from PIL import Image 
import numpy as np 
im = Image.open("/Users/Hugo/green_leaves.jpg") 
im.load() 
height, widht = im.size 
p = np.array([0,0,0]) 
for row in range(height): 
    for col in range(widht): 
     a = im.getpixel((row,col)) 
     p = np.append(a.asarray()) 

但我收到以下錯誤

Traceback (most recent call last): 
    File "/Users/hugo/PycharmProjects/Meteo API/image.py", line 17, in <module> 
    p = np.append(a.asarray()) 
AttributeError: 'tuple' object has no attribute 'asarray' 

你能幫助我嗎?

+0

我不知道numpy,但'a'是內建的'tuple'類型,並沒有這樣的方法。它是一個數組的python等價物。 – 2rs2ts

回答

10

你提到了numpy。如果你想要一個圖像的numpy數組,不要遍歷它,只要做data = np.array(im)

E.g.

from PIL import Image 
import numpy as np 
im = Image.open("/Users/Hugo/green_leaves.jpg") 
p = np.array(im) 

通過反覆附加到它構建一個numpy的陣列是非常低效。 Numpy數組不像python列表(python列表非常好用!)。它們是固定大小,均勻,高效的內存陣列。

如果您確實想要通過追加構建一個numpy數組,可以使用一個列表(可以高效地追加到),然後將該列表轉換爲numpy數組。

但是,在這種情況下,PIL圖像支持直接轉換爲numpy數組。

還有一點需要注意,我上面給出的例子並不是100%的代碼。 p將是一個由numbands(3或4)數組構成的寬度的高度,而不是numbands數組中的numpixels,就像它在原始示例中一樣。

如果你想在陣列重塑成numbands numpixels,只是做:

p = p.reshape(-1, p.shape[2]) 

(或相當於p.shape = -1, p.shape[2]

這將numbands(3或4陣列重塑成width*height ,取決於是否有alpha通道)數組。換句話說,圖像中的紅色,綠色,藍色,alpha像素值序列。 -1是一個佔位符,它告訴numpy根據指定的其他尺寸計算第一個軸的適當形狀。

2

初始化p爲列表,並且之後轉換爲numpy的陣列for循環:

p=[] 
for row in range(height): 
    for col in range(widht): 
     a = im.getpixel((row,col)) 
     p.append(a) 
p=np.asarray(p) 

這將創建形狀的列表(*,3),其是相同np.array(im).reshape(-1, 3)。所以,如果你需要這個,只需使用後一種形式;)