Ланцош Интерполяция в Python с 2D изображениями - PullRequest
0 голосов
/ 26 февраля 2020

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

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

Первое использование изображения PIL:

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)

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

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Во втором случае вы изменяете размер изображения 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)
1 голос
/ 26 февраля 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 режим - оттенки серого или Lightness здесь:

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

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

newVariable = Image.fromarray(...).resize()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...