簡體   English   中英

如何在python中以更快的方式迭代圖像像素?

[英]How can i iterate over image pixels in a faster manner in python?

我想以某種方式修改灰度圖像,以便可以將圖像上半部分的像素值更改為黑色。 我當然可以通過這樣的常規方式迭代來做到這一點:

for i in range(0,rows):
  for j in range(0,cols):
    if(condition)
      image[i,j] = 0;

但由於我必須進行視頻處理,因此速度很慢。 我可以看到我必須使用Image.point() ,但是我不確定如何實現它。 有人可以幫助我嗎?

如果您首先將PIL圖像轉換為numpy數組,這將會快得多。 以下是如何將值低於10的所有像素歸零:

>>> import numpy as np
>>> arr = np.array(img)
>>> arr[arr < 10] = 0
>>> img.putdata(arr)

或者,正如您在評論中所述,這里是您將圖像的上半部分塗黑:

>>> arr[:arr.shape[0] / 2,:] = 0

最后,由於您正在進行視頻處理,請注意您不必遍歷各個幀。 假設您有10幀4x4圖像:

>>> arr = np.ones((10,4,4)) # 10 all-white frames
>>> arr[:,:2,:] = 0         # black out the top half of every frame
>>> a
array([[[ 0.,  0.,  0.,  0.],
    [ 0.,  0.,  0.,  0.],
    [ 1.,  1.,  1.,  1.],
    [ 1.,  1.,  1.,  1.]],

   [[ 0.,  0.,  0.,  0.],
    [ 0.,  0.,  0.,  0.],
    [ 1.,  1.,  1.,  1.],
    [ 1.,  1.,  1.,  1.]],
...

這是多處理圖像的非常好的候選者。 如果將圖像分割成像素塊,則可以非常輕松地並行處理圖像,即如果圖像足夠大或者您在大量圖像上執行此操作。

  1. 將圖像分解為定義為元組的塊(左上角X,左上角Y,寬度,高度)
  2. 將元組和圖像句柄傳遞給各種線程,希望在線程池中。
  3. 等待線程完成,然后繼續使用您的圖像。

這取決於圖像大小和您選擇的線程數和塊大小,可以線性地加速您的過程,直到當然。

暫無
暫無

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

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