在 PIL 中的 PixelAccess 中向量化标量乘法

Vectorize scalar multiplication in PixelAccess in PIL

我需要矢量化 PixelAccess 对象上的标量乘法因子,我目前正在 嵌套 for 循环

输入图像

当前尝试

original = Image.open('img.png')
TEMP = '/tmp/tmp.jpg'
original.save(TEMP, quality=90)
temporary = Image.open(TEMP)
diff = ImageChops.difference(original, temporary)
d = diff.load()
SCALE = 10

# Part to vectorize
WIDTH, HEIGHT = diff.size
for x in range(WIDTH):
    for y in range(HEIGHT):
        d[x, y] = tuple(k * SCALE for k in d[x, y])

问题是 PixelAccess 对象的结构是 3 元素元组的二维数组,这使得它不适合 numpy 框架。

您可以使用 build-in 图像操作而不是访问单个像素:您可以通过 SCALE 的因子缩放来完成,因为使用缩放因子 scale = 2 / SCALE 将图像添加到自身, 请参阅 docs:

diff = ImageChops.add(diff, diff, 2/SCALE)

在我的计算机上,提供的示例图像的速度提高了 95 倍。
请注意,结果将被裁剪为 255。