укладывать 3D-изображения в 4D - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь сложить трехмерные изображения в массив 4D. У меня есть код:

def stack():
   x=None
   dim=(299,299)
   for file in os.listdir(path_to_folder):
        if file.endswith('.jpg'):
            img = cv2.imread(path_to_folder+ file)
            image_a = cv2.resize(img,dim, interpolation = cv2.INTER_AREA)

            img2 = cv2.imread(path_to_folder+ file)
            image_p = cv2.resize(img2,dim, interpolation = cv2.INTER_AREA)

            img3 = cv2.imread(path_to_folder+ file)
            image_n = cv2.resize(img3,dim, interpolation = cv2.INTER_AREA)

            if (x is None):
                x=[(image_a),(image_p),(image_n)]
            else:
                x[0]=np.stack((x[0], (image_a)))
                x[1]= np.stack((x[1],(image_p)))
                x[2]=np.stack((x[2],(image_n)))

    return x

Я ожидаю форму как:

stack=stack()
stack[0].shape
>>out: (5,299,299,3)

len(stack)
>>out: 3

, но я получаю (1495,299,3). Примечание: просто для того, чтобы сосредоточиться на реальной проблеме, я сохранил все 3 файла изображения одинаковыми. я взял generate_triplets функцию из здесь , но в моем случае мои изображения читаются из папки.

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Есть много способов сделать это, и я исследую некоторые из них. Прежде всего, np.stack требует, чтобы все массивы были одинаковой формы. Вы не можете продолжать называть np.stack несколько раз, как это. Простое решение - сохранить все изображения в списке, а затем вызвать стек в самом конце. Позвольте мне создать некоторый фиктивный код:

import numpy as np

def stack():
    x = [[],[],[]]
    dim = (299,299)
    for i in range(5):
        img_a = np.random.randn(dim[0],dim[1],3)
        img_p = np.random.randn(dim[0],dim[1],3)
        img_n = np.random.randn(dim[0],dim[1],3)

        x[0].append(img_a)
        x[1].append(img_p)
        x[2].append(img_n)

    x = [np.stack(im) for im in x]
    return x

stack = stack()
print(out[0].shape)

Out:

(5, 299, 299, 3)
3

Если вы, тем не менее, хотите использовать стек для каждой итерации по какой-то причине, вы все равно можете сделать это, используя vstack. Вам просто нужно сделать каждое 3d изображение четырехмерным, изменив форму.

import numpy as np

def stack():
    x = None
    dim = (299,299)
    for i in range(5):
        img_a = np.random.randn(dim[0],dim[1],3)
        img_p = np.random.randn(dim[0],dim[1],3)
        img_n = np.random.randn(dim[0],dim[1],3)

        if (x is None):
            x=[img_a,img_p,img_n]
        else:
            s = (-1,dim[0],dim[1],3)
            x[0]=np.vstack((x[0].reshape(s), img_a.reshape(s)))
            x[1]=np.vstack((x[1].reshape(s), img_p.reshape(s)))
            x[2]=np.vstack((x[2].reshape(s), img_n.reshape(s)))
    return x

stack = stack()
print(stack[0].shape)
print(len(stack))

Вывод:

(5, 299, 299, 3)
3
0 голосов
/ 25 марта 2020

Изменение функции @ Mercury:

In [398]: def stack(): 
     ...:     alist = [] 
     ...:     dim = (299,299) 
     ...:     for i in range(5): 
     ...:         img_a = np.random.randn(dim[0],dim[1],3) 
     ...:         img_p = np.random.randn(dim[0],dim[1],3) 
     ...:         img_n = np.random.randn(dim[0],dim[1],3) 
     ...:         alist.append([img_a, img_p, img_n]) 
     ...:     return np.array(alist) 

In [399]: stack().shape                                                                        
Out[399]: (5, 3, 299, 299, 3)

alist - это вложенный (5,3) список, содержащий (299 299,3) массивов. Превратившись в массив, он становится 5d.

Мы можем просто перенести это, stack().transpose(1,0,2,3,4). Но np.stack является объединенной версией, которая позволяет нам указать new ось:

In [400]: def stack(): 
     ...:     alist = [] 
     ...:     dim = (299,299) 
     ...:     for i in range(5): 
     ...:         img_a = np.random.randn(dim[0],dim[1],3) 
     ...:         img_p = np.random.randn(dim[0],dim[1],3) 
     ...:         img_n = np.random.randn(dim[0],dim[1],3) 
     ...:         alist.append([img_a, img_p, img_n]) 
     ...:     return np.stack(alist, axis=1) 
     ...:                                                                                      
In [401]: stack().shape                                                                        
Out[401]: (3, 5, 299, 299, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...