Использование изменения размера PIL - правильный способ заменить scipy.mis c .imresize - PullRequest
1 голос
/ 07 апреля 2020

Я унаследовал устаревший код, и из-за обновлений в scipy мне нужно заменить scipy.misc.imresize на PIL.Image.resize.

Это оригинальный код

# xn.shape = (519, 20)
xnr = scipy.misc.imresize(xn, (200, xn.shape[1]))
# xnr.shape = (200, 20) i think ?
SomeOtherArray[i, :] = xnr.flatten()

Как рекомендовано здесь , я должен звонить np.array(Image.fromarray(arr).resize())

# xn.shape = (519, 20)
xnr = np.array(Image.fromarray(xn).resize((200, xn.shape[1])))
# xnr.shape = (20, 200) !!! Not (200, 20)
SomeOtherArray[i, :] = xnr.flatten()

Вопрос 1: Правильно ли, что xnr = scipy.misc.imresize(xn, (200, xn.shape[1])) дает форму (200, 20)

Вопрос 2 : Как я могу сделать так, чтобы после использования PIL, xnr был правильным, как ранее предполагалось в исходном коде?

1 Ответ

2 голосов
/ 07 апреля 2020

Это немного сбивает с толку из-за порядка размеров, различающихся между Numpy и PIL.

Изображение в PIL имеет размер (width, height)

Однако массив Numpy, представляющий изображение, имеет форму (height, width).

Следующий фрагмент иллюстрирует это:

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

random.seed()
xn = random.randint(0, 255, (539,20), dtype=np.uint8)

im = Image.fromarray(xn)

print(im.size)

plt.imshow(im, cmap='gray', vmin=0, vmax=255)
plt.show()

Таким образом, при вызове Image.fromarray(xn) вы получите изображение шириной 20 x 539.

Теперь Image.fromarray(xn).resize((200, xn.shape[1])) - это изображение шириной 200 x 20, полученное путем сжатия исходной высоты 539 до 20 и растяжения исходной ширины 20 до 200.

Если вы хотите сохранить исходную 20 Чтобы уменьшить ширину 539 до 200, нужно сделать следующее:

Image.fromarray(xn).resize((xn.shape[1], 200))

Для контраста scipy.misc.imresize(xn, (200, 20)) возвращает массив с формой (200, 20), как описано в документации:

размер: int, float или tuple

  • int - процент от текущего размера.

  • float - доля от текущего размера .

  • tuple - Размер выходного изображения (высота, ширина) .

...