【发布时间】:2011-06-26 10:56:12
【问题描述】:
我想用 Python 改变一种颜色。
如果存在使用 PIL 的快速解决方案,我更喜欢这个解决方案。
目前,我使用
convert -background black -opaque '#939393' MyImage.png MyImage.png
【问题讨论】:
标签: python image-processing colors imagemagick python-imaging-library
我想用 Python 改变一种颜色。
如果存在使用 PIL 的快速解决方案,我更喜欢这个解决方案。
目前,我使用
convert -background black -opaque '#939393' MyImage.png MyImage.png
【问题讨论】:
标签: python image-processing colors imagemagick python-imaging-library
如果您的机器上可以使用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')
它将使用多一点 (3x) 的内存,但它应该会更快(~5x,但更大的图像更多)。
另外请注意,如果您只有 RGB(而不是 RGBA)图像,上面的代码会稍微复杂一些。但是,此示例将单独保留 alpha 波段,而更简单的版本则不会。
【讨论】:
这是对 Joe Kington 上述回答的修改。如果您的图像也包含 Alpha 通道,以下是如何执行此操作。
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')
我花了很长时间才弄清楚如何让它工作。我希望它可以帮助别人。
【讨论】:
mask 最终是一个布尔值数组?那么如何将其用于索引data 变量?
我刚刚想出了这个解决方案:
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 不快,但对我来说似乎已经足够快了。
【讨论】:
pix[x,y] = mycolor2 而不是使用im.putpixel()。
Image.open("MyImage.png", "w") ,但它不起作用。我不知道如何使用pix[x,y] = mycolor2
im.getcolors() 将返回None 如果颜色数超过 256。所以对于大图像,此解决方案将不起作用。
im.getcolors(width*height) 是要走的路。
此解决方案使用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")
【讨论】: