Как работает keras.preprocessing.image.array_to_img - PullRequest
0 голосов
/ 15 марта 2019

Я использую keras.preprocessing.image.array_to_img для преобразования данных массива (представителя изображения) в изображение.Затем, когда я использую .save(), я замечаю, что данные были преобразованы.

Понятия не имею почему.

Таким образом, я создал простой пример, и оказалось, что array_to_img() действительно делает что-то неожиданное, или я что-то упускаю:


from keras.preprocessing.image import image
import matplotlib.pyplot as plt
import numpy as np

array1=np.array([[[255,0,0],[100,0,0]],
               [[0,0,0],[0,0,0]]])
plt.imshow(array1)
plt.show()

img_4=image.array_to_img()
img_4.save('img_4.jpg')

img_4load = image.load_img('img_4.jpg', target_size=(2, 2))
img_4load_array = image.img_to_array(img_4load)
print(img_4load_array)

Результаты:

[[[117.  39.  39.]
  [ 97.  19.  19.]]

 [[ 65.   0.   0.]
  [ 55.   0.   0.]]]

Данные моего массива были изменены !!

Почему это происходит и как этого избежать?

1 Ответ

0 голосов
/ 15 марта 2019

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

img_4.save('img_4.png')

Вы можете увидеть здесь доступные форматы изображений в модуле PIL, и вы можете узнать больше о сжатии изображений здесь

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