#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. это ближайший сосед, верно?