首页 > 解决方案 > 如何用 2D Numpy 数组替换弹出/附加?

问题描述

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

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

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

如果可能的话,我想就地做这个。这是一个插图。

初始空白框大小640x512

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

在此处输入图像描述

此弹出/推送操作类似于队列,但我想直接在 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)

标签: pythonnumpyopencv

解决方案


在这里,分配将是比串联更有效的选择。


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)

产生这个:

在此处输入图像描述


对于非白色图像,您可以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)

这会产生:

在此处输入图像描述


推荐阅读