如何有效地改变许多图像上的颜色?

2024-04-19 01:42:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个巨大的图像数据集:

images

我想换一下这些衣服的颜色。所有的白色都应该保持白色,所有的紫色都应该变成白色,其他的都应该变成黑色。所需的输出如下所示:

output image

我已经做了下面的代码,它正在做我想要的,但它需要很长的时间来通过大量的图片我有。有没有其他更快的方法?你知道吗

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

Tags: 数据pathnamein图像forsizeif
2条回答

如果您愿意使用NumPy,则可以大大加快像素操作速度:

from PIL import Image
import numpy as np

# Open PIL image
im = Image.open('path/to/your/image.png').convert('RGBA')

# Convert to NumPy array
pixels = np.array(im)

# Get logical indices of all white and purple pixels
idx_white = (pixels == (255, 255, 255, 255)).all(axis=2)
idx_purple = (pixels == (128, 64, 128, 255)).all(axis=2)

# Generate black image; set alpha channel to 255
out = np.zeros(pixels.shape, np.uint8)
out[:, :, 3] = 255

# Set white and purple pixels to white
out[idx_white | idx_purple] = (255, 255, 255, 255)

# Convert back to PIL image
im = Image.fromarray(out)

该代码生成所需的输出,在我的机器上大约需要1秒,而循环代码需要33秒。你知道吗

希望有帮助!你知道吗

您的图像似乎是苍白的,因为它们代表的是分段,或标记类,通常只有不到256个类。因此,每个像素只是一个标签(或类号),实际颜色在256元素表中查找,即调色板。你知道吗

如果您不熟悉托盘图像,请查看here。你知道吗

所以,你不需要迭代所有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')

这需要290ms,包括加载和保存图像。你知道吗


如果您有成千上万的图像要处理,并且您使用的是一个像样的操作系统,那么您可以使用GNU Parallel。更改上面的代码以接受命令行参数,该参数是图像的名称,并将其保存为recolour.py,然后使用:

parallel ./recolour.py {} ::: *.png

它将使所有的CPU核心在你的CPU繁忙,直到他们都被处理。你知道吗

关键词:图像处理,Python,Numpy,PIL,Pillow,palette,getpalette,putpalette,类,分类,标签,标签,标签图像。你知道吗

相关问题 更多 >