Python 二维图像中的 Lanczos 插值

Lanczos Interpolation in Python with 2D images

我尝试重新缩放 2D 图像(灰度)。 图像大小为 256x256,所需输出为 224x224。 像素值范围从0到1300。

我尝试了 2 种方法来使用 Lanczos 插值重新缩放它们:

首次使用 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)

如何正确操作?

在第二种情况下,您正在将 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)

在 PIL 部分,您有一些问题。

首先,您需要检查 dtype 您创建的内容!当你像这样使用 np.random() 时,你创建了一个 np.int64 的数组。如您所知,您的数据最多只能达到 1300,因此最好使用无符号 16 位:

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

其次,当您从 Numpy 数组创建 PIL 图像时,您需要在此处告诉 PIL 模式 - 灰度或亮度:

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

第三,您正在尝试将新创建的 PIL 图像填充回 Numpy 数组 - 不要这样做:

newVariable = Image.fromarray(...).resize()