Numpy изменить размер изображения

#python #numpy #multidimensional-array

#python #numpy #многомерный массив

Вопрос:

Я хотел бы взять изображение и изменить масштаб изображения, пока это массив numpy. Я хотел бы сделать это с помощью собственных функций NumPy без PIL, cv2, SciPy и т. Д

теперь у меня есть это:

 from copy import copy
import numpy as np
from scipy import misc


img = misc.face()  # racoon from SciPy(np.ndarray)
img2 = copy(img)  # copy of racoon, because misc.face() is Descriptor(?)
img2.shape()  # (768, 1024, 3)
  

Какая мне нужна форма = (3072, 4096, 3)

Я могу сделать это легко с помощью Pillow

 CONVERT_IMAGE = Image.fromarray(img.astype('uint8'), 'RGB')
CONVERT_IMAGE = CONVERT_IMAGE.resize((4096, 3072), Image.NEAREST)

IMAGE_AS_ARRAY = np.asarray(CONVERT_IMAGE)
IMAGE_AS_ARRAY.shape  # 3072 4096 3
  

но мне действительно нужно делать это только с помощью функций NumPy без других библиотек

Можете ли вы мне помочь? Я действительно слаб в NumPy и 3D-массивах

Комментарии:

1. numpy не выполняет такого изменения размера. Для этого требуется какая-то интерполяция, которую разработали библиотеки изображений.

2. @hpauji tnx для вашего ответа, но я нахожу уменьшение размера изображения в numpy в некоторых ресурсах в Интернете. Но я не могу нигде найти увеличение размера изображения

3. Вы можете вырезать подмножество значений или, как показано в ответе, реплицировать значения. Но программное обеспечение для обработки изображений может выполнять более сложные изменения размера — усреднение значений, сглаживание изображения и так далее.

Ответ №1:

Ограниченное целочисленным масштабированием с некоторым коэффициентом масштабирования n и без фактической интерполяции, вы можете использовать np.repeat дважды, чтобы получить описанный результат:

 import numpy as np

# Original image with shape (4, 3, 3)
img = np.random.randint(0, 255, (4, 3, 3), dtype=np.uint8)

# Scaling factor for whole integer upscaling
n = 4

# Actual upscaling (results to some image with shape (16, 12, 3)
img_up = np.repeat(np.repeat(img, n, axis=0), n, axis=1)

# Outputs
print(img[:, :, 1], 'n')
print(img_up[:, :, 1])
  

Вот некоторые выходные данные:

 [[148 242 171]
 [247  40 152]
 [151 131 198]
 [ 23 185 144]] 

[[148 148 148 148 242 242 242 242 171 171 171 171]
 [148 148 148 148 242 242 242 242 171 171 171 171]
 [148 148 148 148 242 242 242 242 171 171 171 171]
 [148 148 148 148 242 242 242 242 171 171 171 171]
 [247 247 247 247  40  40  40  40 152 152 152 152]
 [247 247 247 247  40  40  40  40 152 152 152 152]
 [247 247 247 247  40  40  40  40 152 152 152 152]
 [247 247 247 247  40  40  40  40 152 152 152 152]
 [151 151 151 151 131 131 131 131 198 198 198 198]
 [151 151 151 151 131 131 131 131 198 198 198 198]
 [151 151 151 151 131 131 131 131 198 198 198 198]
 [151 151 151 151 131 131 131 131 198 198 198 198]
 [ 23  23  23  23 185 185 185 185 144 144 144 144]
 [ 23  23  23  23 185 185 185 185 144 144 144 144]
 [ 23  23  23  23 185 185 185 185 144 144 144 144]
 [ 23  23  23  23 185 185 185 185 144 144 144 144]]
  
 ----------------------------------------
System information
----------------------------------------
Platform:     Windows-10-10.0.16299-SP0
Python:       3.8.5
NumPy:        1.19.2
----------------------------------------
  

Комментарии:

1. Нет, Ганс, я не могу этого сделать. третий массив — это цвет RGB, а длина третьего массива должна быть три, а не 12. Спасибо за ответ

2. Третье измерение все еще 3 в моем решении !? Вы увеличиваете масштаб от (768, 1024, 3) до (3072, 4096, 3) , что я тоже делаю, если бы я начал (768, 1024, 3) . Кроме того, пожалуйста, обратите внимание, я просто вывожу один канал конечного результата — для удобства чтения.

3. это ближайший сосед, верно?