我正在嘗試使用 Pillow 遍歷影像的所有像素,然后將具有相應 RGBA 顏色的像素附加到字典中
我目前擁有的是:
pixels = {}
frame = frame.convert('RGBA')
w = frame.size[0]
h = frame.size[1]
pix = frame.load()
for y in range(h):
for x in range(w):
point = str(x) "," str(y)
if not point in pixels:
pixels[point] = (pix[x,y][0], pix[x,y][1], pix[x,y][2], pix[x,y][3])
framePillowImage物件在哪里
但是我無法從中獲得最快的結果(對于 800x600 影像,上面的代碼需要大約 0.55 到 1.0 秒)
我嘗試使用 Pandas DataFrame 而不是for回圈,但結果更糟(同一張影像需要 13 秒)
有什么方法可以更快地實作相同的目標?
編輯:我正在嘗試通過僅向用戶發送更新的像素來制作帶寬使用率較低的螢屏共享應用程式。上面的代碼在無限回圈中運行,pixels每次都會將字典與前一個字典進行比較,然后只發送更新像素的字典。
回圈的目的是什么?放置了回圈,因此我可以獲得每個 RGBA 值的 x 和 y 點。因為如果我使用類似的東西list(frame.getdata()),我只會得到一個 RGBA 值的串列,但我不知道如何訪問每個值的坐標
uj5u.com熱心網友回復:
我設法使用串列理解獲得了一個稍快的版本:
pixels = {f"{x},{y}": (*pix[x,y],) for y in range(h) for x in range(w)}
看起來 f 字串也比str(x) "," str(y).
順便說一句,為什么你需要if回圈中的條件?如果我沒記錯的話,你永遠不應該得到同一對 (x,y)。洗掉條件應該會稍微減少版本中的執行時間。
這是我在大影像(~4000x1300)上的表現:
Your version: 8.60s (157.61it/s)
Your version (no if): 8.06s (168.25it/s)
List comprehension: 4.29s (315.67it/s)
但是,我真的不明白你在這里想要做什么。如果你告訴我們更多關于你真正目標的資訊,可能會有更有效的方法來做到這一點。
uj5u.com熱心網友回復:
我仍然不明白您要做什么,但是獲取影像中特定顏色出現位置串列的矢量化方法np.where()如下:
import numpy as np
# Get repeatable randomness
np.random.seed(42)
# Generate an image 100x100 pixels in range 0..255
im = np.random.randint(0,256,(100,100), np.uint8)
# Find Y and X values where the image is 128
Y, X = np.where(im==128)
檢查我們找到了多少——我們預計 100x100 像素的 1/256 是 128,即大約 39:
print(len(X), len(Y))
35 35
這里有一些更復雜的類似事情的例子。
uj5u.com熱心網友回復:
你沒聽說過numpy。
不要使用 .getdata()!改為使用np.asarray()。
from PIL import Image
import numpy as np
pil_image = Image.open("some_image.jpg")
data = np.asarray(pil_image)
print(data.shape) # (height, width, channels)
x = 123
y = 456
print(data[y, x]) # the three color values at that position
# all red values (red ist the first channel, 0):
red = data[:, :, 0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462338.html
