在 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。
我需要矢量化 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。