首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中使用2D图像进行Lanczos插值

在Python中使用2D图像进行Lanczos插值
EN

Stack Overflow用户
提问于 2020-02-26 23:06:43
回答 2查看 2.8K关注 0票数 1

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

我尝试了两种方法,使用Lanczos插值对它们进行重新缩放:

首次使用PIL图像:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)

如何正确地做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-27 02:01:11

在第二种情况下,您将256x256图像的大小调整为224x224,然后将其分配回原始数组的一个切片中。这个片的大小仍然是256x256,所以NumPy不知道如何进行数据复制。

相反,创建一个大小合适的新输出数组:

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2020-02-27 03:44:13

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

首先,你需要检查你创建的东西的dtype!当您像这样使用np.random()时,您将创建一个np.int64数组。因为您知道您的数据仅在1300达到最大值,因此无符号16位更可取:

代码语言:javascript
复制
array = np.random.randint(0, 1300, size=(10, 256, 256), dtype=np.uint16)

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

代码语言:javascript
复制
array[0] = Image.fromarray(array[0], 'L')

第三,您正在尝试将新创建的PIL Image重新填充到一个Numpy数组中-不要这样做:

代码语言:javascript
复制
newVariable = Image.fromarray(...).resize()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60416856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档