Почему он показывает разные изображения в массиве 4d numpy - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь создать массив 4D для группы 3D-изображений.Я могу загрузить изображение и правильно отобразить изображение, но после сохранения его в массиве 4D и показа изображения из массива, оно показывает бред.

Я попытался сравнить, загружено ли изображение и прочитано измассив 4D равен, и он печатает True.

import os
from glob import glob
import numpy as np
from PIL import Image

IMG_PATH = '32x32'
img_paths = glob(os.path.join(IMG_PATH, '*.jpg'))
images = np.empty((len(img_paths), 32, 32, 3))
for i, path_i in enumerate(img_paths):
    img_i = np.array(Image.open(path_i))
    Image.fromarray(img_i, 'RGB').show() # showing correct image
    images[i] = img_i
    Image.fromarray(images[i], 'RGB').show() # showing gibberish
    print(np.array_equal(img_i, images[i])) # True
    if i == 0:
        break

Я ожидаю показать точно такое же изображение, как я бегу images[i] = img_i.

1 Ответ

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

Эта линия выполняет приведение:

images[i] = img_i

С images.dtype == np.float64, но img_i.dtype - это вероятно np.uint8.


ВыМожно отследить этот тип ошибки, указав правило приведения:

np.copy_to(images[i], img_i, casting='no')
# TypeError: Cannot cast scalar from dtype('uint8') to dtype('float64') according to the rule 'no'

Это можно исправить, присвоив массиву правильный тип:

images = np.empty((len(img_paths), 32, 32, 3), dtype=np.uint8)

Или вы можете разрешитьNumpy сделать выделение для вас, но это будет временно использовать почти вдвое больше памяти:

images = np.stack([
    Image.open(path_i)
    for path_i in img_paths
], axis=0)
...