簡體   English   中英

使用PIL和Image.point進行像素到像素編輯

[英]Pixel to pixel edit using PIL and Image.point

我似乎無法理解Image point的作用。 我想進行一些像素編輯,其中可能包括檢查每個像素中最大的顏色值(r,g或b)並采取相應的措施。 可以說我不能使用numpy。 我設法使用Image point將相同的值添加到圖像中的每個像素。 點碼

import Image, math

def brightness(i, value):
value = math.floor(255*(float(value)/100))
return i+value

if __name__ == '__main__':
    image = '/home/avlahop/verybig.jpg'
    print image
    img = Image.open(image)
    print img
    out = img.point(lambda i: brightness(i, 50))
    out.show()

numpy代碼

def brightness(arr, adjust):
    import math
    adjust = math.floor(255*(float(adjust)/100))


    arr[...,0] += adjust
    arr[...,1] += adjust
    arr[...,2] += adjust
    return arr

if __name__ == '__main__':
    image = '/home/avlahop/verybig.jpg'
    img = Image.open(image).convert('RGBA')
    arr = np.array(np.asarray(img).astype('float'))
    new_image = Image.fromarray(brightness(arr, adjust).clip(0,255).astype('uint8'), 'RGBA').show()

我不得不說,點代碼比numpy的要快。 但是,如果我想對point執行更復雜的操作該怎么辦。 例如,對於每個像素,檢查max(r,g,b)並根據r = max或g = max或b = max進行操作。 如您所見,我將功能點用作參數。 我需要一個論點。 我這是什么? 是像素嗎?(即i =(r,g,b)?)。我似乎無法從pil文檔中了解

在早期版本的PIL中,文檔可能還不清楚,但是在Pillow中,說明得很好。 Image.point

lut –查找表,在圖像中每個波段包含256個值。 可以改用函數,它應使用單個參數。 對每個可能的像素值調用一次該函數,並將結果表應用於圖像的所有波段。

換句話說,這不是通過函數映射每個像素的通用方法,它只是動態構建查找表的一種方法,而不是傳入預構建的表。

換句話說,它被稱為從0255的數字。 (您可以通過編寫一個將其參數附加到全局列表,然后在末尾轉儲該列表的函數輕松地找到自己的位置……)

如果將圖像分成單獨的帶或平面,則將每個帶或平面point不同的功能,然后重新組合它們,這也許可以完成您要嘗試的操作。 但是即使那樣,我仍然認為eval是您想要的,而不是point

但是我認為您真正想要的是一個逐像素的全波段一次迭代器。 而且您不需要任何特殊的東西。 只需使用map或對getdata的理解getdata 那不是很慢嗎? 當然,它很慢,因為它會X * Y次調用您的函數。 與該成本相比,構建getdata序列並對其進行迭代的成本很小,因此,尋找一種PIL優化已經足夠快的部分的方法不會使您走得太遠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM