Стек 200 двумерных массивов с размерами (100 * 100) в трехмерном массиве с числами (200 * 100 * 100) - PullRequest
0 голосов
/ 04 января 2019

Я хочу создать 200 кадров изображения размером (100 * 100) и поместить их в трехмерный массив с конечным размером (200 * 100 * 100), где ось x представляет каждый кадр, т. Е. (1, 100, 100). ) должен быть первый кадр.

Я не могу сложить их в трехмерный массив. Первый цикл создает массив (2 100 100), складывая первые два кадра, но не работает после этого и приводит к массиву (2,)

import numpy as np
import random




def createCircle(width,height , rad ):
  w = random.randint(1, height)
  h = random.randint(1, height)
  center = [int(w), int(h)]
  radius = rad
  Y, X = np.ogrid[:height, :width]
  dist_from_center = np.sqrt((X - center[0])**2 + (Y-center[1])**2)
  mask = dist_from_center <= radius
  return mask


def addCircle(test_image):
  m = createCircle(width = 100, height = 100 , rad = 8 )
  masked_img = test_image.copy()
  masked_img[m] = 0
  return masked_img

img = np.zeros([100,100],dtype=np.uint8)
img.fill(20)
img_test = img  


def noise(image):
  row,col= image.shape
  mean = 0
  var = 0.1
  sigma = var**0.5
  gauss = np.random.normal(mean,sigma,(row,col))
  gauss = gauss.reshape(row,col)
  noisy = image + gauss #adding gauss noise
  s1 = np.sin(8)   #adding sin fill
  noisy += s1
  return noisy


#creates 1st frame
for i in range(4):
  im_first = addCircle(test_image=img_test)
  im_first = noise(im_first)



for i in range(200):
  for j in range(4):
    img_test = addCircle(test_image=img_test)
  im1 = noise(img_test)
  img_test = img
  im_first = np.array([im_first, im1])#stacks every new frame   (im1)#error in this    

Мне нужно (200 100 100)

Ответы [ 3 ]

0 голосов
/ 04 января 2019

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

ims = np.zeros((200, 100, 100)) # initialize your array
for i in range(200):
  for j in range(4):
    img_test = addCircle(test_image=img_test)
  im1 = noise(img_test)
  ims[i, ...] = im1 # add the image to our initialized array
0 голосов
/ 04 января 2019

Один из подходов состоит в том, чтобы создать список двумерных матриц, которые вы хотите сложить и использовать np.stack(arrays, axis=0)

Пример

arrays = [np.random.randn(100, 100) for _ in range(200)] #each matrix is of shape (100,100)
stacked_array = np.stack(arrays, axis=0) #stacked_array.shape is (200,100,100)
0 голосов
/ 04 января 2019

Вы можете использовать numpy.stack для этого. Смотрите мой пример

import numpy as np

a = np.array([[1,2],[3,4]])
b = np.array([[10,11],[12,13]])
c = np.stack((a,b))
print(c.shape) #prints (2,2,2)
print(c[0])
print(c[1])

вывод 2-го отпечатка

[[1 2]
 [3 4]]

вывод 3-го отпечатка

[[10 11]
 [12 13]]

Обратите внимание, что вы должны подавать tuple двумерных массивов в numpy.stack, а не отдельные двумерные массивы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...