私はPythonで単一の色を変更したいと思います。他の色ですべてのピクセルの色を変更してください
PILの高速ソリューションが存在する場合は、このソリューションを使用することをお勧めします。現時点で
は、私が
convert -background black -opaque '#939393' MyImage.png MyImage.png
私はPythonで単一の色を変更したいと思います。他の色ですべてのピクセルの色を変更してください
PILの高速ソリューションが存在する場合は、このソリューションを使用することをお勧めします。現時点で
は、私が
convert -background black -opaque '#939393' MyImage.png MyImage.png
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ではない)イメージしか持たない場合に必要となるよりも少し複雑です。簡単なバージョンが持っていないのに対しただし、この例では、単独のアルファバンドを残します。
を使用私はこの解決策を考え出したしました:
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が速くありませんが、私のために十分に高速であると思われます。
これは上記のジョーキングトンの答えの変更です。画像にアルファチャンネルが含まれている場合、これを行う方法は次のとおりです。
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')
これを動作させる方法を理解するまでには長い時間がかかりました。私はそれが他の人を助けることを望む。
この解決策では、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
の変更です。 – zeekay
私はこれを試してみましたが、私はので、私はイメージを開いているモード(R「」)のエラーが発生します。私は '' Image.open( "MyImage.png"、 "W")しようとしたが、それは動作しません。私は 'PIXおそらく[X、Y] =それが働かない理由がわからないmycolor2' –
、バグを使うことができるか分かりませんか? – zeekay