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

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

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

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

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

我已经在下面编写了代码,它可以满足我的要求,但是花很长时间才能浏览我拥有的图片数量。有另一种更快的方法吗?

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):
                im.putpixel((x,y),(255,255))
            elif im.getpixel((x,y)) == (128,64,128,255))
            else:
                im.putpixel((x,(0,255))

    im.show()
chendy0899 回答:如何有效地更改许多图像的颜色?

您的图像似乎代表了分割或标记的类别,因此显得灰白了,通常少于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]

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

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


如果要处理成千上万张图像,并且您使用的操作系统还不错,则可以使用 GNU Parallel 。更改以上代码以接受作为图像名称的命令行参数,并将其另存为recolour.py,然后使用:

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

它将使您CPU上的所有CPU内核都处于繁忙状态,直到它们全部处理完毕为止。

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

,

如果您愿意使用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)).all(axis=2)
idx_purple = (pixels == (128,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)

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

该代码生成所需的输出,并且在我的计算机上花费大约1秒,而您的循环代码需要33秒。

希望有帮助!

本文链接:https://www.f2er.com/3110413.html

大家都在问