Как разместить pop / append с 2D массивом Numpy? - PullRequest
1 голос
/ 23 апреля 2019

У меня есть кадр с размерами 640x512, который хранится в виде массива Numpy со всеми белыми пикселями.Я хочу постоянно удалять / pop (0) самый левый столбец и добавлять его с черным столбцом в каждой итерации.По сути, я пытаюсь сместить изображение справа налево, чтобы в конечном итоге заменить все изображение черными пикселями, по одному столбцу за раз.Я пытался использовать np.concatenate(), но продолжаю получать эти две ошибки.

ValueError: все входные массивы должны иметь одинаковое количество измерений

ValueError: не может транслировать вводмассив из формы (512,1) в форму (640)

Если возможно, я бы хотел сделать это на месте.Вот иллюстрация.

Начальный пустой кадр размером 640x512

image

Каждая итерация добавляет новый черный столбец (1 пиксель) к кадру сконечный результат с полностью черным изображением

enter image description here

Это действие всплывающего / толкающего типа похоже на очередь, но вместо этого я хочу сделать это непосредственно на 2D Numpyмассивы.Я не хочу использовать какую-либо другую структуру данных, поскольку я помещаю эти изображения непосредственно в OpenCV, поэтому я хотел бы сохранить ее в виде массива 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 ]

5 голосов
/ 23 апреля 2019

Назначение будет гораздо более эффективным вариантом, чем конкатенация здесь.


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

2 голосов
/ 23 апреля 2019

blank_pixels[:,:1] = black_column

2 голосов
/ 23 апреля 2019

Я не вижу предоставленные вами фотографии.Вы говорите об этом эффекте?

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...