我正在为色度键(绿屏)编写脚本,并使用Python和PIL(枕头)合成一些视频。我可以设置720p图像的关键点,但是绿色溢出部分还剩下一些。可以理解,但是我正在编写例程以消除泄漏……但是我在努力花多长时间。我可以使用numpy技巧来获得更好的速度,但是我并不那么熟悉。有任何想法吗?
这是我的漏油处理程序。它需要一个PIL图像和一个灵敏度数字,但到目前为止,我一直将其设置为1 ...效果很好。我要花4秒钟多一点的时间来拍摄720p帧,以消除这种溢出。为了进行比较,色度键例程每帧运行大约2秒。
def despill(img, sensitivity=1):
"""
Blue limits green.
"""
start = time.time()
print '\t[*] Starting despill'
width, height = img.size
num_channels = len(img.getbands())
out = Image.new("RGBA", img.size, color=0)
for j in range(height):
for i in range(width):
#r,g,b,a = data[j,i]
r,g,b,a = img.getpixel((i,j))
if g > (b*sensitivity):
out_g = (b*sensitivity)
else:
out_g = g
# end if
out.putpixel((i,j), (r,out_g,b,a))
# end for
# end for
out.show()
print '\t[+] done.'
print '\t[!] Took: %0.1f seconds' % (time.time()-start)
exit()
return out
# end despill
我尝试将输出像素值写入numpy数组,而不是putpixel,然后将其转换为PIL图像,但是平均仅需要5秒钟以上的时间,因此速度更快。我知道putpixel不是最简单的选择,但我很茫然...
最佳答案
putpixel
很慢,并且像这样的循环甚至更慢,因为它们是由Python解释器运行的,就像地狱一样慢。通常的解决方案是立即将图像转换为numpy数组,并通过对其进行矢量化操作解决问题,这些操作在经过高度优化的C代码中运行。在您的情况下,我会做类似的事情:
arr = np.array(img)
g = arr[:,:,1]
bs = arr[:,:,2]*sensitivity
cond = g>bs
arr[:,:,1] = cond*bs + (~cond)*g
out = Image.fromarray(arr)
(这可能是不正确的,我相信可以对其进行更好的优化,这只是一个草图)
关于python - 调整PIL像素值的更快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33181060/