【问题标题】:Change specific RGB color pixels to another color, in image file在图像文件中将特定的 RGB 颜色像素更改为另一种颜色
【发布时间】: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


    【解决方案1】:

    如果您的机器上可以使用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 波段,而更简单的版本则不会。

    【讨论】:

    • 如果原始颜色未知,但更改图像所需的颜色已知怎么办?如何/应该如何修改?
    【解决方案2】:

    这是对 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 变量?
    【解决方案3】:

    我刚刚想出了这个解决方案:

    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()
    • 我试过这个,但由于我打开图像的模式('r')而出现错误。我试过 Image.open("MyImage.png", "w") ,但它不起作用。我不知道如何使用pix[x,y] = mycolor2
    • im.getcolors() 将返回None 如果颜色数超过 256。所以对于大图像,此解决方案将不起作用。
    • @PhaniRithvij 您可以更改该最大值,请参阅docs。有趣的是它首先存在
    • @MartinThoma 所以im.getcolors(width*height) 是要走的路。
    【解决方案4】:

    此解决方案使用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")
    

    https://stackoverflow.com/a/6483549/541208的修改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      相关资源
      最近更新 更多