gpt4 book ai didi

python - Python 中最快的图像迭代

转载 作者:行者123 更新时间:2023-11-28 19:23:12 25 4
gpt4 key购买 nike

我正在使用 Python 2.7.4 创建一个简单的绿屏应用程序,但得到的结果非常慢。我目前正在使用 PIL 1.1.7 来加载和迭代图像,并看到从旧的 getpixel() 到更新的 load() 和像素访问对象索引的巨大加速变化。然而,对于大约 720p 分辨率的图像,以下循环仍然需要大约 2.5 秒才能运行:

def colorclose(Cb_p, Cr_p, Cb_key, Cr_key, tola, tolb):
temp = math.sqrt((Cb_key-Cb_p)**2+(Cr_key-Cr_p)**2)
if temp < tola:
return 0.0
else:
if temp < tolb:
return (temp-tola)/(tolb-tola)
else:
return 1.0

....

for x in range(width):
for y in range(height):
Y, cb, cr = fg_cbcr_list[x, y]
mask = colorclose(cb, cr, cb_key, cr_key, tola, tolb)
mask = 1 - mask
bgr, bgg, bgb = bg_list[x,y]
fgr, fgg, fgb = fg_list[x,y]
pixels[x,y] = (
(int)(fgr - mask*key_color[0] + mask*bgr),
(int)(fgg - mask*key_color[1] + mask*bgg),
(int)(fgb - mask*key_color[2] + mask*bgb))

我是不是在做一些非常低效的事情,导致运行速度如此之慢?我见过类似的、更简单的示例,例如循环被 bool 矩阵替换,但对于这种情况,我看不到替换循环的方法。

pixels[x,y] 赋值似乎花费了最多的时间,但我不太了解 Python,我不确定是否有更有效的方法来完成这项工作。

如有任何帮助,我们将不胜感激。

最佳答案

最好逐行遍历像素,因为这是内存中使用的布局。

所以代替:

for x in range(width):
for y in range(height):

使用

for y in range(height):
for x in range(width):

编辑:例如,为什么这很重要,您可以阅读有关 iterating over an array 的 numpy 文档

An important thing to be aware of for this iteration is that the order is chosen to match the memory layout of the array instead of using a standard C or Fortran ordering. This is done for access efficiency, reflecting the idea that by default one simply wants to visit each element without concern for a particular ordering. We can see this by iterating over the transpose of our previous array, compared to taking a copy of that transpose in C order.

关于python - Python 中最快的图像迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786002/

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