Python-чтение изображений в матрицу изображений



Я пытаюсь прочитать несколько изображений rgb в одну матрицу, так что размеры матрицы (image_size, image_size, index), например,данные [:,:, 1] должны получить 1-е изображение.



data = np.zeros((image_dim, image_dim, numImages), dtype=np.float64)
for fname in os.listdir('images/sample_images/'):
name='....'
image=mpimg.imread(name)
data = np.append(data, image)
return data


Изображение.форма = (512, 512, 3)
данные.форма = (512, 512, 100)



Помимо того, что np.append оставляет меня с пустым массивом данных, есть ли другой способ добавления значений массива изображений к матрице больших данных?



Заранее спасибо

629   3  

3 ответов:

Пост Фалько, безусловно, является каноническим способом сделать это. Однако, если я могу предложить более numpy / Питонный способ сделать это, я бы позволил первому измерению быть индексом изображения, которое вы хотите, в то время как второе и третье измерения будут строками и столбцами изображения, и, возможно, четвертое измерение будет цветовым каналом, который вы хотите. Поэтому, предположив, что ваше изображение имеет размеры M x N и у вас есть K изображения, вы создадите матрицу, которая будет K x M x N длинной или K x M x N x 3 длинной в случай цветных изображений.

Таким образом, простой однострочный в numpy может быть таким, учитывая ваш текущий код:

data = np.array([mpimg.imread(name) for name in os.listdir('images/sample_images/')], dtype=np.float64)
Таким образом, если вы хотите получить доступ к I - му образу, вы просто сделаете data[i]. Это будет работатьнезависимо от того, является ли изображение RGB или оттенками серого... таким образом, выполнив data[i], вы получите изображение RGB или изображение в оттенках серого, в зависимости от того, что вы решили использовать для упаковки массива. Однако вы должны убедиться, что все изображения соответствуют друг другу... То есть они все цветные или все оттенки серого.

Однако, чтобы показать вам, что это работает, давайте попробуем это с 5 x 5 x 3 "RGB" изображениями, где каждое начинается с 0 и увеличивается до K-1, где K в этом случае будет 10:

data = np.array([i*np.ones((5,5,3)) for i in range(10)], dtype=np.float64)

Давайте посмотрим пример выполнения (в IPython):

In [26]: data = np.array([i*np.ones((5,5,3)) for i in range(10)], dtype=np.float64)

In [27]: data.shape
Out[27]: (10, 5, 5, 3)

In [28]: img = data[0]

In [29]: img
Out[29]: 
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

In [30]: img.shape
Out[30]: (5, 5, 3)

In [31]: img = data[7]

In [32]: img
Out[32]: 
array([[[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]],

       [[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]],

       [[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]],

       [[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]],

       [[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]]])

In [33]: img.shape
Out[33]: (5, 5, 3)

В приведенном выше примере я создал образец массива данных, и это 10 x 5 x 5 x 3, как мы и ожидали. У нас есть 10 матриц 5 x 5 x 3. Затем я извлекаю первое изображение "RGB", и все это 0s, как мы ожидайте, с размером 5 x 5 x 3. Я также извлекаю восьмой кусочек, и мы все получаем 7s, как и ожидали, с размером 5 x 5 x 3.

Очевидно, выберите тот ответ, который вы считаете лучшим, но я лично пошел бы с вышеуказанным маршрутом, поскольку индексирование в Ваш массив, чтобы захватить правильное изображение, проще - вы позволяете вещанию измерений делать работу за вас.

Лучше использовать dstack для укладки массивов в 3-м измерении:

data = np.zeros((3, 3, 0))
for i in range(5):
    image = np.random.rand(3, 3, 1)
    data = np.dstack((data, image))
print data.shape

Вывод:

(3, 3, 5)
Примечание: здесь я предполагаю, что каждое (случайное) изображение имеет один канал. Если у вас есть изображения RGB, вы получите в итоге в 3 раза больше результирующих каналов, т. е. форму (3, 3, 15).

Как читать изображения с диска в матрицу NumPy 4D (для машинного обучения):

Во-первых, метод утилиты (мои изображения 14x64px имеют 3 канала каждый, форма изображения(14, 64, 3)):

def read_image(image_path):
    # cv2.IMREAD_COLOR 
    # cv2.COLOR_BGR2GRAY 
    image = cv2.imread(image_path, cv2.IMREAD_COLOR)
    #print("image shape", image.shape)
    #plt.imshow(image, cmap='gray')
    #plt.show()
    return np.array(image)

Далее я помещаю все свои изображения в 4-мерную матрицу NumPy:

training_features = np.array([read_image(path) for path in image_paths])

Результирующая форма матрицы (5626, 14, 64, 3), он имеет 5626 14x64px цветных изображений.

Comments

    Ничего не найдено.