次のコードを使用して、写真の特定の色(グレー)を白に変更します。しかし、コードは遅すぎます。任意の提案や代替案を歓迎します。
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')
最後にインデントがないので、各出力画像を50回保存していると思います。コードを次のように変更しました。
import numpy as np
from PIL import Image
for j in range(0, 10):
filename = f'{str(j)}.jpg'
print(f'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(f'x_{filename}')
160はテストに時間がかかりすぎたので、10枚の画像で試してみました。私のラップトップでは、6k x 4kのjpg画像が表示されます。
$ /usr/bin/time -f %M:%e ../grey.py
processing 0.jpg ...
processing 8.jpg ...
processing 9.jpg ...
435588:70.75
つまり、70.8秒と436MBのメモリです。
pyvipsを使用してプログラムを書き直しました。この種のことでは、通常、PIL、numpy、opencvよりもはるかに高速です。pyvipsバージョンは次のようになります。
import pyvips
for j in range(0, 10):
filename = f'{str(j)}.jpg'
print(f'processing {filename} ...')
im = pyvips.Image.new_from_file(filename, access='sequential')
# 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(f'x_{filename}')
私のラップトップで私は見る:
$ /usr/bin/time -f %M:%e ../grey-vips.py
processing 0.jpg ...
...
processing 8.jpg ...
processing 9.jpg ...
152084:4.87
4.9秒と152MBのメモリ。
もちろん、それは少し不公平です。Amitayが言うように、あなたのコードは範囲をマスクするのではなくループしていますが、それを修正するのに十分なnumpyを私はよく知りません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加