2016-08-02 75 views
0

我使用以下代碼將特定顏色(灰色)更改爲照片中的白色。但是代碼太慢了。歡迎任何建議或替代方案。在Python中將一系列顏色更改爲白色

import os 
import numpy as np 
from PIL import Image 
for j in range(1,160): 
    im = Image.open(str(j)+'.jpg') 
    data = np.array(im) 
    for i in (range(205,254)): 
     r1, g1, b1 = i, i, i # Original 
     r2, g2, b2 = 255, 255, 255 # Replacement 

     red, green, blue = data[:,:,0], data[:,:,1], data[:,:,2] 
     mask = (red == r1) & (green == g1) & (blue == b1) 
     data[:,:,:3][mask] = [r2, g2, b2] 

     im = Image.fromarray(data) 
     im.save(os.getcwd()+'\\conv\\'+str(j)+'.jpg') 
+0

如果您想要以更快的速度進行圖像處理,您應該使用GPU,並且使用OpenCV而不是PIL(以適當的方式)可能會影響性能,因爲PIL相當高。這可能是有用的:http://docs.opencv.org/2.4/modules/gpu/doc/introduction.html –

回答

1

我認爲你是在最後缺少縮進,您節省了輸出圖像的50倍。我改變你的代碼是:

import os 
import numpy as np 
from PIL import Image 

for j in range(1, 10): 
    filename = str(j) + '.jpg' 
    print 'processing', filename, '...' 

    im = Image.open(filename) 
    data = np.array(im) 
    for i in range(205, 254): 
     r1, g1, b1 = i, i, i # Original 
     r2, g2, b2 = 255, 255, 255 # Replacement 

     red, green, blue = data[:,:,0], data[:,:,1], data[:,:,2] 
     mask = (red == r1) & (green == g1) & (blue == b1) 
     data[:,:,:3][mask] = [r2, g2, b2] 

    im = Image.fromarray(data) 
    im.save('x_' + filename) 

160花了太長時間進行測試,所以我只嘗試了10張圖片。在我的筆記本採用了2K x 2K分辨率的JPG圖片我看到:

$ time ../grey.py 
processing 1.jpg ... 
... 
processing 9.jpg ... 

real 0m7.884s 
user 0m7.912s 
sys 0m0.300s 

我使用vips改寫程序。它有一個high-level Python binding,這是much faster than PIL, numpy or opencv這種事情。貴賓版的樣子:

import gi 
gi.require_version('Vips', '8.0') 
from gi.repository import Vips 

for j in range(1, 10): 
    filename = str(j) + '.jpg' 
    print 'processing', filename, '...' 

    im = Vips.Image.new_from_file(filename) 

    # find all pixels where RGB are equal 
    mask = (im[0] == im[1]) & (im[1] == im[2]) 

    # we also need g > 204 
    mask &= im[1] > 204 

    # and send all those pixels to 255 
    im = mask.ifthenelse(255, im) 

    im.write_to_file('x_' + filename) 

在我的筆記本電腦我看到:

$ time ../grey-vips.py 
processing 1.jpg ... 
... 
processing 9.jpg ... 

real 0m0.880s 
user 0m2.052s 
sys 0m0.072s 

所以大約快10倍。如Amitay所說,當然這有點不公平,因爲你的代碼是循環而不是掩蓋範圍,但我不知道numpy是否足以解決這個問題。

+0

這比我自己的代碼在Windows 10中的40張圖片快4倍。 – imi

0

這種圖像處理方式很慢,因爲它是單線程的,而且很直接。嘗試將它分成多個相等的部分,並同時運行它們以實現主要的加速(嘗試使用函數分割作業並檢查結果:更多更小的塊與更少的更大的塊)。 爲了更好的改進:GPU支持圖像操作,但在Python中非常困難。

0

您正在搜索圖像中所有值都是相同的所有thae值。因此,首先爲所有三個通道的所有像素創建一個遮罩,而不是僅從您的範圍內留下的遮罩。 試試下面的代碼:

import os 
import numpy as np 
from PIL import Image 
for j in range(1,160): 
    im = Image.open(str(j)+'.jpg') 
    data = np.array(im) 
    for i in (range(205,254)): 
     r1, g1, b1 = i, i, i # Original 
     r2, g2, b2 = 255, 255, 255 # Replacement 

     red, green, blue = data[:,:,0], data[:,:,1], data[:,:,2] 
     maskEqualValues = (red==green) & (red==blue) & (green==blue) 
     maskEqualValuesVal = np.multiply(maskEqualValues,red); 
     mask = (maskEqualValuesVal > 205) & (maskEqualValuesVal <= 254) 

     im = Image.fromarray(data) 
     im.save(os.getcwd()+'\\conv\\'+str(j)+'.jpg') 
相關問題