我認爲你是在最後缺少縮進,您節省了輸出圖像的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是否足以解決這個問題。
如果您想要以更快的速度進行圖像處理,您應該使用GPU,並且使用OpenCV而不是PIL(以適當的方式)可能會影響性能,因爲PIL相當高。這可能是有用的:http://docs.opencv.org/2.4/modules/gpu/doc/introduction.html –