用其他颜色更改所有像素的颜色
image-processing
imagemagick
python
python-imaging-library
5
0

我想使用Python更改单一颜色。

如果存在使用PIL的快速解决方案,我希望使用此解决方案。

此刻,我用

convert -background black -opaque '#939393' MyImage.png MyImage.png
参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

如果您的计算机上有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)图像,则上面的代码比需要的代码稍微复杂一些。但是,此示例将单独保留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')

我花了很长时间才弄清楚如何使其工作。我希望它可以帮助其他人。

收藏
评论

我刚刚想出了以下解决方案:

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不够快,但对我来说似乎足够快。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号