Почему при изменении dtype numpy .array с int на float выводится numpy .imshow () - PullRequest
3 голосов
/ 27 марта 2020

Сегодня я столкнулся со странной вещью, которую не могу объяснить и не могу найти ответ. Может быть, у меня есть какое-то фундаментальное недоразумение, и я не вижу очевидного, но я думаю, что я нахожусь в той точке, где я буду кусать пулю, когда меня сейчас вызывают, зная, что происходит.

Я загружаю некоторые данные изображения, используя PIL, и преобразую их в массив numpy. Здесь нет ничего особенного. Однако затем я меняю тип данных с целого на плавающее, чтобы на более позднем этапе я смог нормализовать каналы RGB.

Я бы ожидал, что изменение типа данных с int на float на самом деле никак не изменит изображение. Однако ...

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

im = Image.open("test.jpg")

до изменения dtype:

plt.imshow(np.array(im))  

enter image description here

после изменения dtype:

plt.imshow(np.array(im).astype(float))    

enter image description here

Это то, что можно ожидать? Если так ... почему? Что мне не хватает?

Приветствия и спасибо заранее !!

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Если вы посмотрите документы, вы увидите, что imshow ожидает:

  • (M, N): изображение со скалярными данными. Значения сопоставляются с цветами с использованием нормализации и карты цветов. См. Параметры норма, cmap, vmin, vmax.

  • (M, N, 3): изображение со значениями RGB ( 0-1 с плавающей запятой или 0-255 int).

Поэтому, когда они имеют тип dtype float, они ожидают, что они находятся в диапазоне 0-1, поэтому мы должны разделить его на 255, чтобы получить ожидаемый результат, в противном случае вы увидите негатив изображения.

Вот пример использования образца изображения из sklearn.datasets:

from sklearn.datasets import load_sample_images
dataset = load_sample_images()     
first_img_data = dataset.images[0]
plt.imshow(first_img_data)

enter image description here

Для ограничения значений в диапазон 0 - 1, мы просто должны разделить на 255:

plt.imshow(first_img_data.astype(float)/255)

enter image description here

0 голосов
/ 27 марта 2020

В функции matplotlib.pyplot.imshow написано следующее:

Parameters:
        X : array-like or PIL image
            The image data. Supported array shapes are:
            - (M, N): an image with scalar data. The values are mapped to
              colors using normalization and a colormap. See parameters *norm*,
              *cmap*, *vmin*, *vmax*.
            - (M, N, 3): an image with RGB values (0-1 float or 0-255 int).
            - (M, N, 4): an image with RGBA values (0-1 float or 0-255 int),
              i.e. including transparency.

эта работа для вас:

plt.imshow(np.array(im).astype(float)/255)

...