2016-12-20 65 views
1

我有一個圖像(列表的列表),我想返回整個圖像的平均顏色。 我嘗試使用ZIP()切片圖像分成3份紅色,綠色,藍色,但是當我運行代碼:無法從使用zip列表的列表獲取平均顏色(紅色,綠色,藍色)

def average(image): 
    """Returns the average color of the pixels in the image""" 
    red = [] 
    green = [] 
    blue = [] 
    for r, g, b in zip(image): 
     red.append(r), green.append(g), blue.append(b) 
    average_color = (sum(red)/len(red)), (sum(green)/len(green)), \ 
        (sum(blue)/(len(blue))) 
    return average_color 

它說:

ValueError: not enough values to unpack (expected 3, got 1). 

我不知道是什麼是錯的,zip()只做1片?

+0

'圖像'是一系列'(紅,綠,藍)'值嗎? –

回答

1

如果image是一個包含(r, g, b)值的元組序列,則需要將整個序列作爲單獨的參數與*args一起應用。這將產生3名新的名單,與你分離色帶:

def average(image): 
    red, green, blue = zip(*image) 
    return (
     sum(red)/len(red), 
     sum(green)/len(green), 
     sum(blue)/(len(blue)) 

zip()從一個或多個iterables結合值;你給它只是一個迭代,所以你只得到相同的值返回:

>>> sample = [('foo', 'bar', 'baz'), ('spam', 'ham', 'eggs')] 
>>> next(zip(sample)) 
('foo', 'bar', 'baz') 

但是如果你使用*args應用每個所包含元素的順序爲單獨說法,彷彿你zip(args[0], args[0], ..., args[n])稱爲zip(),有效地給你行的轉置列:

>>> next(zip(*sample)) 
('foo', 'spam') 

其中'foo''spam'sample兩元組的第一個值。

相關問題