如何有效地改变大量图像的颜色?

use*_*495 1 python image colors image-processing python-imaging-library

我有一个巨大的图像数据集,如下所示:

图片

我想改变这些的颜色。所有白色应保持白色,所有紫色应变为白色,其他所有内容应变为黑色。所需的输出如下所示:

输出图像

我已经在下面编写了代码,它正在执行我想要的操作,但是需要很长时间才能浏览我拥有的大量图片。还有另一种更快的方法吗?

path = r"C:path"
for f in os.listdir(path):
f_name = (os.path.join(path,f))
if f_name.endswith(".png"):
    im = Image.open(f_name)
    fn, fext = os.path.splitext(f_name)
    print (fn)
    im =im.convert("RGBA")
    for x in range(im.size[0]):
        for y in range(im.size[1]):
            if im.getpixel((x, y)) == (255, 255, 255, 255):
                im.putpixel((x, y),(255, 255, 255,255))
            elif im.getpixel((x, y)) == (128, 64, 128, 255):
                im.putpixel((x, y),(255, 255, 255,255))
            else:
                im.putpixel((x, y),(0, 0, 0,255))

    im.show()
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

您的图像似乎是调色板,因为它们代表分段或标记的类别,并且类别通常少于 256 个。因此,每个像素只是一个标签(或类号),实际颜色在 256 个元素的表(即调色板)中查找。

如果您不熟悉托盘化图像,请查看此处。

因此,您不需要迭代所有 1200 万像素,您可以只迭代只有 256 个元素长的调色板......

#!/usr/bin/env python3

import sys
import numpy as np
from PIL import Image

# Load image
im = Image.open('image.png')

# Check it is palettised as expected
if im.mode != 'P':
    sys.exit("ERROR: Was expecting a palettised image")

# Get palette and make into Numpy array of 256 entries of 3 RGB colours
palette = np.array(im.getpalette(),dtype=np.uint8).reshape((256,3))

# Name our colours for readability
purple = [128,64,128]
white  = [255,255,255]
black  = [0,0,0]

# Go through palette, setting purple to white
palette[np.all(palette==purple, axis=-1)] = white

# Go through palette, setting anything not white to black
palette[~np.all(palette==white, axis=-1)] = black

# Apply our modified palette and save
im.putpalette(palette.ravel().tolist())
im.save('result.png')
Run Code Online (Sandbox Code Playgroud)

这需要 290 毫秒(包括加载和保存图像)。


如果您有数千个图像要做,并且您使用的是不错的操作系统,则可以使用GNU Parallel。更改上面的代码以接受命令行参数,即图像的名称,并将其保存为recolour.py然后使用:

parallel ./recolour.py {} ::: *.png
Run Code Online (Sandbox Code Playgroud)

它将使 CPU 上的所有 CPU 核心保持忙碌状态,直到它们全部处理完毕。

关键词:图像处理、Python、Numpy、PIL、Pillow、调色板、getpalette、putpalette、类、分类、标签、标签、标记图像。