在python中移位图像像素的有效方法

时间:2017-02-19 13:00:36

标签: python image python-imaging-library

试图找到一种在python中高效移动图像像素的方法。最终希望在每次轮班后在屏幕上显示结果。例如,1920,1080处的像素变为1920,1079处的像素,并且1920,1080填充有新值,在0,0处的末端像素被丢弃并且填充有来自0,1的像素。希望在像raspi 3这样的慢速处理器上达到30fps或更高。

我的直觉是将所有内容移动到一维数组,将所有内容移到“左侧”,在末尾添加新像素并转回图像。

我正在寻找的“Z”变换效果的粗略绘制

Crude drawing of the "Z" shifting effect I'm looking for

这是我对像素移位的天真实现,这太慢了:

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

2 个答案:

答案 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)

enter image description here