将图像文件中特定RGB颜色像素更改为另一种颜色

19 投票
4 回答
40068 浏览
提问于 2025-04-16 20:18

我想用Python改变一种颜色。

如果有快速的解决方案可以用PIL库来实现,我更倾向于这个方案。

目前,我使用的是

convert -background black -opaque '#939393' MyImage.png MyImage.png

4 个回答

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 这个函数不算快,但对我来说似乎已经够用了。

5

这是对乔·金顿上面回答的一个修改。如果你的图片包含透明通道,下面是怎么做的。

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')

我花了很长时间才弄明白怎么让它工作。希望这能帮助到其他人。

33

如果你的电脑上装了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格式)。不过,这个例子会保留透明度通道,而一个更简单的版本就不会保留这个通道。

撰写回答