Интерполяция Ланцоша в Python с 2D-изображениями

Я пытаюсь масштабировать 2D-изображения (оттенки серого). Размер изображения — 256x256, желаемый результат — 224x224. Значения пикселей находятся в диапазоне от 0 до 1300.

Я попробовал 2 подхода к их масштабированию с помощью интерполяции Ланцоша:

Первое использование PIL Image:

import numpy as np
from PIL import Image
import cv2

array = np.random.randint(0, 1300, size=(10, 256, 256))
array[0] = Image.fromarray(array[0]).resize(size=(224, 224), resample=Image.LANCZOS)

в результате появляется сообщение об ошибке: ValueError: image has wrong mode

И затем CV2:

array[0] = cv2.resize(array[0], dsize=(224, 224), interpolation=cv2.INTER_LANCZOS4)

в результате сообщение об ошибке: ValueError: could not broadcast input array from shape (224,224) into shape (256,256)

Как это сделать правильно?


person tamtam_    schedule 26.02.2020    source источник
comment
Теперь это должен быть минимальный воспроизводимый пример :)   -  person tamtam_    schedule 26.02.2020
comment
Просто подозрение (давно не работал с opencv). Константы в cv2 обозначаются немного по-разному, когда вы работаете с python по сравнению с родным c. Я бы еще раз проверил - действительно ли это имя константы в python (я так не думаю)   -  person Grzegorz Skibinski    schedule 26.02.2020


Ответы (2)


Во втором случае вы изменяете размер изображения 256x256 до 224x224, а затем назначаете его обратно в срез исходного массива. Этот слайс по-прежнему имеет размер 256x256, поэтому NumPy не знает, как сделать копию данных.

Вместо этого создайте новый выходной массив правильных размеров:

array = np.random.randint(0, 1300, size=(10, 256, 256))
newarray = np.zeros((10, 224, 224))
newarray[0] = cv2.resize(array[0], dsize=(224, 224), interpolation=cv2.INTER_LANCZOS4)
person Cris Luengo    schedule 26.02.2020

В части PIL у вас есть несколько проблем.

Во-первых, вам нужно проверить dtype вещей, которые вы создаете! Вы создаете массив np.int64, когда используете np.random() таким образом. Поскольку вы знаете, что ваши данные не превышают 1300, предпочтительнее беззнаковый 16-битный:

array = np.random.randint(0, 1300, size=(10, 256, 256), dtype=np.uint16)

Во-вторых, когда вы создаете изображение PIL из массива Numpy, вам нужно указать режим PIL - оттенки серого или яркость здесь:

array[0] = Image.fromarray(array[0], 'L')

В-третьих, вы пытаетесь вставить только что созданный образ PIL обратно в массив Numpy - не делайте этого:

newVariable = Image.fromarray(...).resize()
person Mark Setchell    schedule 26.02.2020