答えて

15

numpyはあなたのマシン上で使用可能な場合は、のようなものをやってみてください:

import numpy as np 
from PIL import Image 

im = Image.open('fig1.png') 
data = np.array(im) 

r1, g1, b1 = 0, 0, 0 # Original value 
r2, g2, b2 = 255, 255, 255 # Value that we want to replace it with 

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('fig1_modified.png') 

それは少し(3回)より多くのメモリを使用しますが、それは(大きな画像のために〜5倍、しかしより)かなりでなければなりませんもっと早く。

また、上記のコードは、RGB(およびRGBAではない)イメージしか持たない場合に必要となるよりも少し複雑です。簡単なバージョンが持っていないのに対しただし、この例では、単独のアルファバンドを残します。

4

を使用私はこの解決策を考え出したしました:

import Image 
im = Image.open("MyImage.png") 
width, height = im.size 
colortuples = im.getcolors() 
mycolor1 = min(colortuples)[1] 
mycolor2 = max(colortuples)[1] 
pix = im.load() 
for x in range(0, width): 
    for y in range(0, height): 
     if pix[x,y] == mycolor1: 
      im.putpixel((x, y), mycolor2) 
im.save('MyImage.png') 

putpixelが速くありませんが、私のために十分に高速であると思われます。

+0

の変更です。 – zeekay

+0

私はこれを試してみましたが、私はので、私はイメージを開いているモード(R「」)のエラーが発生します。私は '' Image.open( "MyImage.png"、 "W")しようとしたが、それは動作しません。私は 'PIXおそらく[X、Y] =それが働かない理由がわからないmycolor2' –

+0

、バグを使うことができるか分かりませんか? – zeekay

2

これは上記のジョーキングトンの答えの変更です。画像にアルファチャンネルが含まれている場合、これを行う方法は次のとおりです。

import numpy as np 
import Image 

im = Image.open('fig1.png') 
im = im.convert('RGBA') 
data = np.array(im) 

r1, g1, b1 = 0, 0, 0 # Original value 
r2, g2, b2, a2 = 255, 255, 255, 255 # Value that we want to replace it with 

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

im = Image.fromarray(data) 
im.save('fig1_modified.png') 

これを動作させる方法を理解するまでには長い時間がかかりました。私はそれが他の人を助けることを望む。

0

この解決策では、globを使用してフォルダ内のすべてのpngを編集し、色を削除して別のものに置き換えますが、RGBAを使用します。

import glob 
from PIL import Image 

old_color = 255, 0, 255, 255 
new_color = 0, 0, 0, 0 

for path in glob.glob("*.png"): 
    if "__out" in path: 
     print "skipping on", path 
     continue 

    print "working on", path 

    im = Image.open(path) 
    im = im.convert("RGBA") 
    width, height = im.size 
    colortuples = im.getcolors() 

    pix = im.load() 
    for x in xrange(0, width): 
     for y in xrange(0, height): 
      if pix[x,y] == old_color: 
       im.putpixel((x, y), new_color) 

    im.save(path+"__out.png") 

それはおそらく違い速度が賢明なことはありませんが、あなたは、 `PIX [X、Y] = mycolor2`代わりに` im.putpixelを() `使用しての操作を行うことができhttps://stackoverflow.com/a/6483549/541208

関連する問題