2012-11-19 50 views
1

我想以某種方式修改灰度圖像,以便我可以將圖像上半部分的像素值更改爲黑色。我可以用通常的方式是這樣遍歷當然做到這一點:如何在python中以更快的方式迭代圖像像素?

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

但是,這是相當緩慢的,因爲我必須做的視頻處理。我可以看到我必須使用Image.point(),但我不確定如何實現它。有人能幫我解決這個問題嗎?

+1

你嘗試過numpy和數組嗎? – lolopop

+0

條件是什麼?它取決於行列索引還是像素值? –

+0

好吧,我只想將圖像像素的一半設置爲黑色。我只寫了一個方式來顯示我的問題,而不是實際的代碼 –

回答

6

如果首先將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.]], 
... 
+0

看起來你是對的,但我不喜歡這樣的IM [:行/ 2 ,:] = 0 –

0

這是一個非常好的候選人,用於多處理圖像。如果將圖像分割爲多個像素塊,則可以非常方便地並行處理圖像,也就是說,如果圖像足夠大,或者您正在大量圖像上進行處理,則可以非常方便地處理圖像。

  1. 打破圖像成定義爲元組塊(左上X,左上Y,寬度,高度)
  2. 通行證元組和圖像手柄各個線程,希望在一個線程池。
  3. 等待線程完成,然後繼續使用您的圖像。

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

+0

非常感謝,但各個線程爲了這麼簡單的任務? nt它昂貴嗎? –

+0

這是昂貴的,爲什麼我有結局部分。在我輸入之後,如果你是通過很多圖像來完成此操作,或者圖像的尺寸非常大,那麼這會很有意義。 – sean

相關問題