Как изменить размер изображения при преобразовании в массив - PullRequest
0 голосов
/ 26 сентября 2019

Учтите, что у нас есть только изображения в виде файла .npy.Можно ли изменить размеры изображений без преобразования их в изображения (потому что я ищу способ, который будет быстрым при запуске кода).Для получения дополнительной информации я спросил путь без преобразования в изображение, у меня есть изображения, но я не хочу использовать их в коде, потому что мой набор данных слишком велик, а работа с изображениями очень медленная, с другой стороны, я не уверен, какойразмер лучше для моих изображений, поэтому я ищу способ, который сначала преобразует изображения в npy и сохраняет файл .npy, а затем предварительно обрабатывает файл npy, например, изменяет размер изображения.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Если вы имеете дело только с numpy массивами, я думаю, что slicing будет достаточно

Скажем, форма загруженного массива numpy равна (m, n) (один канал), ицелевая форма (a, b).Тогда шаг может быть (s1, s2) = (m // a, n // b)

Таким образом, исходный массив может быть нарезан на

new_array = old_array[::s1, ::s2]

РЕДАКТИРОВАТЬ

Масштабировать массив также довольно просто, если вы используете маски для продвинутой нарезкиНапример, форма исходного массива - (m, n), а целевая форма - (a, b).Тогда в качестве примера

a, b = 300, 200
m, n = 3, 4

original = np.linspace(1, 12, 12).reshape(3, 4)
canvas = np.zeros((a, b))
(s1, s2) = (a // m, b // n) # the scalar

# the two masks  
mask_x = np.concatenate([np.ones(s1) * ind for ind in range(m)])
mask_y = np.concatenate([np.ones(s2) * ind for ind in range(n)])

# make sure the residuals are taken into account
if len(mask_x) < a: mask_x = np.concatenate([mask_x, np.ones(len(mask_x) % a) * (m - 1)])
if len(mask_y) < b: mask_y = np.concatenate([mask_y, np.ones(len(mask_y) % b) * (n - 1)])
mask_x = mask_x.astype(np.int8).tolist()
mask_y = mask_y.astype(np.int8).tolist()

canvas = original[mask_x, :]
canvas = canvas[:, mask_y]
0 голосов
/ 26 сентября 2019

Попробуйте PIL, возможно, это достаточно быстро для вас.

import numpy as np
from PIL import Image

arr = np.load('img.npy')
img = Image.fromarray(arr)
img.resize(size=(100, 100))

Обратите внимание, что вам нужно вычислить соотношение сторон, если вы хотите сохранить его.Или вы можете использовать Image.thumbnail(), который может использовать фильтр сглаживания.

Там также scikit-image, но я подозреваю, что он использует PIL под капотом,Он работает с массивами NumPy:

import skimage.transform as st

st.resize(arr, (100, 100))

Я предполагаю, что другой вариант - OpenCV .

...