matplotlib plt.show () визуальный сбой при предварительной индексации пустого массива numpy - PullRequest
0 голосов
/ 07 ноября 2018

Итак, я испытываю странный визуальный сбой при создании пустого массива и загрузки в него изображения следующим образом:

import numpy as np
from imageio import imread
import matplotlib.pyplot as plt

dir_path = os.path.join('path/to/image', 'a.jpg')
# Pre-indexing numpy array
X = np.empty((1, *(111, 455), 4))

# Loading image in the traditional way:
img_0 = imread(dir_path)
# Loading image and saving it in the pre-indexed array:
X[0] = imread(dir_path)

# Check whether image contents are the same
print((img_0 == X[0]).all())

# Display images
imgplot = plt.imshow(X[0])
plt.show()
imgplot = plt.imshow(img_0)
plt.show()

Итак, в этом коде я импортирую изображение a.jpg либо через традиционный imread, либо сохраняя его в массиве numpy. Теоретически оба метода должны быть эквивалентны, фактически print((img_0 == X[0]).all()) возвращает True.

Однако, это plt.show() результаты:

numpy изображение: numpy image

традиционное изображение: traditional image

Если содержимое двух массивов в точности совпадает, как возможно, что два изображения отображаются по-разному при импорте с помощью одной и той же функции чтения?

1 Ответ

0 голосов
/ 07 ноября 2018

Проблема в том, что когда вы помещаете изображение в ваш массив X, оно изменяется от int до float, а методы масштабирования отличаются от plt.imshow для целых чисел и чисел с плавающей запятой. Это описано в предупреждающем сообщении, которое вы, вероятно, получили:

Обрезка входных данных до допустимого диапазона для imshow с данными RGB ([0..1] для чисел с плавающей запятой или [0..255] для целых чисел).

Вы можете либо создать экземпляр X в виде массива int, либо принудительно X[0] ввести dtype int, либо нормализовать изображение в диапазоне от 0 до 1, разделив его на 255:

# Method 1:
X = np.empty((1, *(111, 455), 3), dtype=int)
X[0] = imread(dir_path)

imgplot = plt.imshow(X[0])
plt.show()

# Method 2:
X = np.empty((1, *(111, 455), 3))
X[0] = imread(dir_path)

imgplot = plt.imshow(X[0].astype(int))
plt.show()

# method 3:
imgplot = plt.imshow(X[0]/255)
plt.show()

Следуя одному из этих методов, вы получите:

enter image description here

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