gpt4 book ai didi

python - 操作图像中的 RGB 值

转载 作者:行者123 更新时间:2023-12-01 00:18:49 30 4
gpt4 key购买 nike

我想对通过 PIL 加载的图像的 RBG 值应用简单的代数运算。我当前的版本可以工作,但速度很慢:

from PIL import Image
import numpy as np

file_name = '1'
im = Image.open('data/' + file_name + '.jpg').convert('RGB')
pixels = np.array(im)
s = pixels.shape
p = pixels.reshape((s[0] * s[1], s[2]))


def update(ratio=0.5):
p2 = np.array([[min(rgb[0] + rgb[0] * ratio, 1), max(rgb[1] - rgb[1] * ratio, 0), rgb[2]] for rgb in p])
img = Image.fromarray(np.uint8(p2.reshape(s)))
img.save('result/' + file_name + '_test.png')
return 0

update(0.5)

有人有更有效的想法吗?

最佳答案

利用 NumPy 的向量化运算来消除循环。

我修改了您原来的方法来比较以下不同解决方案之间的性能。另外,我使用 ImageMath 添加了仅 PIL 方法,如果你想完全摆脱 NumPy。

此外,我认为存在/曾经有一个错误:

p2 = np.array([[min(rgb[0] + rgb[0] * ratio, 1), max(rgb[1] - rgb[1] * ratio, 0), rgb[2]] for rgb in p])

您实际上转换为float ,所以应该是255而不是1min打电话。

这是我所做的:

import numpy as np
from PIL import Image, ImageMath
import time


# Modified, original implementation; fixed most likely wrong compare value in min (255 instead of 1)
def update_1(ratio=0.5):
pixels = np.array(im)
s = pixels.shape
p = pixels.reshape((s[0] * s[1], s[2]))
p2 = np.array([[min(rgb[0] + rgb[0] * ratio, 255), max(rgb[1] - rgb[1] * ratio, 0), rgb[2]] for rgb in p])
img = Image.fromarray(np.uint8(p2.reshape(s)))
img.save('result_update_1.png')
return 0


# More efficient vectorized approach using NumPy
def update_2(ratio=0.5):
pixels = np.array(im)
pixels[:, :, 0] = np.minimum(pixels[:, :, 0] * (1 + ratio), 255)
pixels[:, :, 1] = np.maximum(pixels[:, :, 1] * (1 - ratio), 0)
img = Image.fromarray(pixels)
img.save('result_update_2.png')
return 0


# More efficient approach only using PIL
def update_3(ratio=0.5):
(r, g, b) = im.split()
r = ImageMath.eval('min(float(r) / 255 * (1 + ratio), 1) * 255', r=r, ratio=ratio).convert('L')
g = ImageMath.eval('max(float(g) / 255 * (1 - ratio), 0) * 255', g=g, ratio=ratio).convert('L')
Image.merge('RGB', (r, g, b)).save('result_update_3.png')
return 0


im = Image.open('path/to/your/image.png')

t1 = time.perf_counter()
update_1(0.5)
print(time.perf_counter() - t1)

t1 = time.perf_counter()
update_2(0.5)
print(time.perf_counter() - t1)

t1 = time.perf_counter()
update_3(0.5)
print(time.perf_counter() - t1)

[400, 400] 上的性能我的机器上的 RGB 图像:

1.723889293 s    # your approach
0.055316339 s # vectorized NumPy approach
0.062502050 s # PIL only approach

希望有帮助!

关于python - 操作图像中的 RGB 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59100363/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com