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()
我尝试重新缩放 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()