def colorize(im, h, s, l_adjust):
result = Image.new('RGBA', im.size)
pixin = np.copy(im)
pixout = np.array(result)
>>>>>>>>>>>>>>>>> loop <<<<<<<<<<<<<<<<<
for y in range(pixout.shape[1]):
for x in range(pixout.shape[0]):
lum = currentRGB(pixin[x, y][0], pixin[x, y][1], pixin[x, y][2])
r, g, b = colorsys.hls_to_rgb(h, lum, s)
r, g, b = int(r * 255.99), int(g * 255.99), int(b * 255.99)
pixout[x, y] = (r, g, b, 255)
>>>>>>>>>>>>>>>>>>>>> Loop end <<<<<<<<<<<
return result
试图从一帧输入视频中找到每像素HSL值,但需要花费1.5秒的时间,但希望将时间至少减少到0.3秒以内。不使用这两个循环有没有更快的方法?寻找类似LUT(查找表)/矢量化/带有NumPy快捷方式的东西来避免这两个循环。谢谢
或
第二部分->&燃气轮机
如果我将自定义currentRGB()分解为for循环,它看起来像:
def colorize(im, h, s, l_adjust):
result = Image.new('RGBA', im.size)
pixin = np.copy(im)
pixout = np.array(result)
for y in range(pixout.shape[1]):
for x in range(pixout.shape[0]):
currentR, currentG, currentB = pixin[x, y][0]/255 , pixin[x, y][1]/255, pixin[x, y][2]/255
#luminance
lum = (currentR * 0.2126) + (currentG * 0.7152) + (currentB * 0.0722)
if l_adjust > 0:
lum = lum * (1 - l_adjust)
lum = lum + (1.0 - (1.0 - l_adjust))
else:
lum = lum * (l_adjust + 1)
l = lum
r, g, b = colorsys.hls_to_rgb(h, l, s)
r, g, b = int(r * 255.99), int(g * 255.99), int(b * 255.99)
pixout[x, y] = (r, g, b, 255)
return pixout
您可以使用Numba大大加快计算速度。以下是实施方案:
这个优化的并行实现比我的6核机器(在800x600图像上)上的原始代码快约2000倍。
hls_to_rgb
实现来自this post。注意@nb.njit
decorators中的字符串不是必需的,但它使Numba能够提前编译函数,而不是在第一次调用时编译。有关这些类型的更多信息,请阅读Numba documentation相关问题 更多 >
编程相关推荐