试图找到一种在python中高效移动图像像素的方法。最终希望在每次轮班后在屏幕上显示结果。例如,1920,1080处的像素变为1920,1079处的像素,并且1920,1080填充有新值,在0,0处的末端像素被丢弃并且填充有来自0,1的像素。希望在像raspi 3这样的慢速处理器上达到30fps或更高。
我的直觉是将所有内容移动到一维数组,将所有内容移到“左侧”,在末尾添加新像素并转回图像。
我正在寻找的“Z”变换效果的粗略绘制
这是我对像素移位的天真实现,这太慢了:
from PIL import Image
im = Image.new("RGBA", (1920, 1080), "black") #create blank image
pix = im.load() #load image
#iterate over width and height
for x in xrange(1,1919):
pix[x,y] = pix[x+1, y] #shift x
for y in xrange(1,1079):
pix[x,y] = pix[x, y+1] #shift y
pix[1919,1079] = (255,255,255) #set new pixel white
答案 0 :(得分:0)
我不认为你会在覆盆子pi上获得接近30fps的任何地方,但我会看到numpy和pandas。
答案 1 :(得分:0)
我想到了几种方法,但目前只能在台式机Mac上获得40fps。
这是第一种在其心脏使用Numpy roll()
的方法,以便将左上角的像素向下滚动到右下角,然后用白色覆盖。
#!/usr/bin/env python3
import cv2
import numpy as np
from PIL import Image
w, h = 640, 480
im = Image.new("L", (w, h), 127)
# Just do 1,000 shifts so it can be timed
for frame in range(1000):
# Ravel image out to row vector, roll it left, and reshape
im = np.roll(np.ravel(im),-1).reshape(h,w)
# Make bottom right pixel white
im[-1,-1] = 255
cv2.imshow("Slidey Pushy",im)
cv2.waitKey(1)
然后我想到了在开始时立即添加所有新像素,然后在每次迭代中仅将偏移量更改为图像,但是令人惊讶的是(至少对我而言)这并不快。
#!/usr/bin/env python3
import cv2
import numpy as np
from PIL import Image
w, h = 640, 480
im = Image.new("L", (w, h), 127)
# Allocate space for and append 10 rows of white pixels up front
im = np.concatenate((im,np.ones((10*h,w),dtype=np.uint8)*255), axis=0)
im = np.ravel(im)
# Slide in 1,000 white pixels so it can be timed
for frame in range(1000):
frame = im[frame:frame+w*h].reshape(h,w)
cv2.imshow("Slidey Pushy 2",frame)
cv2.waitKey(1)