更改PIL中的像素颜色值

Kup*_*ppo 9 python python-imaging-library

我需要在python中更改图像的像素颜色.除了像素值(255,0,0)红外,我需要将每个像素颜色值更改为黑色(0,0,0).我尝试了以下代码但它没有帮助.

from PIL import Image
im = Image.open('A:\ex1.jpg')
for pixel in im.getdata():
    if pixel == (255,0,0):
        print "Red coloured pixel"
    else:
        pixel = [0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

Ann*_*nno 14

你可以使用img.putpixel

im.putpixel((x, y), (255, 0, 0))
Run Code Online (Sandbox Code Playgroud)


mag*_*ni- 13

看到这个wikibook:https://en.wikibooks.org/wiki/Python_Imaging_Library/Editing_Pixels

修改该代码以适合您的问题:

pixels = img.load() # create the pixel map

for i in range(img.size[0]): # for every pixel:
    for j in range(img.size[1]):
        if pixels[i,j] != (255, 0, 0):
            # change to black if not red
            pixels[i,j] = (0, 0 ,0)
Run Code Online (Sandbox Code Playgroud)

  • 文档描述了“load()”很慢:“访问单个像素相当慢。如果您要循环遍历图像中的所有像素,则可能有一种使用 Pillow API 的其他部分更快的方法。` 他们没有指定除此之外的任何内容,但 [loxaxs 的答案](https://stackoverflow. com/a/36469395/1052284)是一个合理的猜测。 (4认同)
  • 不是OP需要反过来吗?(将非红色像素更改为黑色)? (3认同)

lox*_*axs 6

这是我使用 PIL 来做你想做的事情的方法:

from PIL import Image

imagePath = 'A:\ex1.jpg'
newImagePath = 'A:\ex2.jpg'
im = Image.open(imagePath)

def redOrBlack (im):
    newimdata = []
    redcolor = (255,0,0)
    blackcolor = (0,0,0)
    for color in im.getdata():
        if color == redcolor:
            newimdata.append( redcolor )
        else:
            newimdata.append( blackcolor )
    newim = Image.new(im.mode,im.size)
    newim.putdata(newimdata)
    return newim

redOrBlack(im).save(newImagePath)
Run Code Online (Sandbox Code Playgroud)


inn*_*ndo 6

将问题推向极端,以下是如何随机更改 PIL 中的通道(忽略任何 0,我认为这是背景)

rr, gg, bb = in_img.split()
rr = rr.point(lambda p: 0 if p==0 else np.random.randint(256) )
gg = gg.point(lambda p: 0 if p==0 else np.random.randint(256) )
bb = bb.point(lambda p: 0 if p==0 else np.random.randint(256) )
out_img = Image.merge("RGB", (rr, gg, bb))
out_img.getextrema()
out_img.show()
Run Code Online (Sandbox Code Playgroud)

享受!