如何在2D Numpy数组中放置弹出/追加?

时间:2019-04-23 03:39:08

标签: python numpy opencv

我有一个尺寸为640x512的图像帧,存储为所有白色像素的Numpy数组。我想不断删除/ pop(0)最左边的列,并在每次迭代中添加一个黑列。本质上,我试图将图像从右移到左,以最终将整个图像替换为黑色像素,一次替换一列。我曾尝试使用np.concatenate(),但一直出现这两个错误。

  

ValueError:所有输入数组的维数必须相同

     

ValueError:无法将输入数组从形状(512,1)广播到形状(640)

如果可能,我想就地进行。这是一个例子。

大小为640x512的初始空白帧

每次迭代都会在帧中添加一个新的黑色列(1像素),最终结果将具有完全黑色的图像

enter image description here

此弹出/推入操作类似于队列,但我想直接在2D Numpy数组上执行此操作。我不想使用任何其他数据结构,因为我将这些图像直接放入OpenCV中,因此我想将其保留为Numpy数组。如何一次将2D numpy数组移动一个像素?

import numpy as np
import cv2

black_column = np.zeros([512,1], dtype=np.uint8)
blank_pixels = np.zeros([512, 640], dtype=np.uint8)
blank_pixels[:] = 255

while True:
    # Pop
    blank_pixels[:-1] = blank_pixels[1:]
    # Push
    blank_pixels[-1] = black_column

    #blank_pixels[:] = np.concatenate(blank_pixels[1:], black_column)

    cv2.imshow('blank_pixels', blank_pixels)
    cv2.waitKey(1)

3 个答案:

答案 0 :(得分:5)

分配比此处的连接更为有效。


blank = np.full((640, 512), 255, dtype=np.uint8)

for i in range(blank.shape[1]-1, -1, -1):
    blank[:, i] = 0
    cv2.imshow('img', blank)
    cv2.waitKey(1)

产生这个:

enter image description here


对于非白色图像,可以使用以下方法roll

blank = np.random.randint(1, 256, (640, 512), dtype=np.uint8)

for i in range(blank.shape[1]-1, -1, -1):
    blank = np.roll(blank, -1, axis=1)
    blank[:, -1] = 0
    cv2.imshow('img', blank)
    cv2.waitKey(1)

这将产生:

enter image description here

答案 1 :(得分:2)

我看不到您提供的图片。您是在谈论这种效果吗?

import cv2
import numpy as np


blank_pixels = np.ones([512, 640], dtype=np.uint8)*255

for i in range(640):
    # Pop
    blank_pixels[:, :-1] = blank_pixels[:, 1:]
    # Push
    blank_pixels[:, -1] = 0
    cv2.imshow('blank_pixels', blank_pixels)
    cv2.waitKey(1)
cv2.waitKey(0)
cv2.destroyAllWindows()

答案 2 :(得分:2)

sizeof