python - 如何用 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)
解决方案
在这里,分配将是比串联更有效的选择。
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)
这会产生:
推荐阅读
- oracle - PLSQL 触发器引发应用程序错误不起作用
- php - 在codeigniter中上传压缩图像大小
- database - 将数据从 VBA 中的 SQL 加载到组合框
- azure-webjobs - Azure Webjob 3.0 - 无法从计时器函数中的 appsettings.json 读取配置变量
- javascript - 检查输入类型单选属性后,我无法选择它
- java - 在 jboss 服务器中为 Web 应用程序进行新部署后,浏览器缓存文件未更新
- javascript - 在 google 图表和 amcharts4 之间没有得到相同的图表
- spring-boot - 注销在 Spring Security OAuth2 中无法正常工作
- pine-script - 如何绘制从以 barsince 定义的最高条数的结果
- android - Dagger 2.10+:在活动和片段中注入活动上下文的依赖项