【问题标题】:Lanczos Interpolation in Python with 2D images带有 2D 图像的 Python 中的 Lanczos 插值
【发布时间】:2026-01-31 08:55:01
【问题描述】:

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

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

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

如何正确操作?

【问题讨论】:

  • 现在它应该是一个最小的可重现示例:)
  • 只是一个怀疑(我与opencv 合作已经有一段时间了)。 cv2 中的常量在使用 python 与原生 c 时的表示方式略有不同。我会仔细检查 - 这是否真的是 python 中常量的名称(我认为不是)

标签: python opencv image-processing python-imaging-library downsampling


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 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()
    

    【讨论】: