【问题标题】:PIL Bicubic Interpolation wiPIL 双三次插值
【发布时间】:2020-01-31 15:52:29
【问题描述】:

所以,我有一个形状的 ndarray:(28, 28, 1),我想使用双三次插值将其放大到 (33, 33, 1)
这是我通过网上搜索得到的:

import numpy as np
from PIL import Image as pil_image

...

img = np.array(pil_image.fromarray(img).resize(intermediate_dim, pil_image.BICUBIC))
# print(img.shape) -> (28, 28, 1), print(intermediate_dim) -> (33, 33)

但我不断收到错误消息:

回溯(最近一次通话最后一次):
文件“filters.py”,第 256 行,在
可视化层(mnist,LAYER_NAME)
文件“filters.py”,第 232 行,位于 visual_layer
img_loss = _generate_filter_image(input_img, output_layer.output, f)
_generate_filter_image 中的文件“filters.py”,第 161 行 img = np.array(pil_image.fromarray(img).resize(intermediate_dim, pil_image.BICUBIC))
文件“BlaBlaBla\Python37\site-packages\PIL\Image.py”,第 2682 行,在 fromarray
raise TypeError("无法处理此数据类型:%s, %s" % typekey)
TypeError: 无法处理此数据类型:(1, 1, 1), |u1

看到这个后,我尝试使用img.astype(np.uint8),但没有任何帮助。
我做错了什么?

附:我确定该数组包含合法值(来自 [0, 255] 的整数)

【问题讨论】:

  • 请显示您的代码,包括您的import 语句以及您如何加载图像。另外,请出示您的图片。
  • @MarkSetchell 关于加载...这是来自 Keras CNN 的过滤器。我不想在我的问题中涉及机器学习的东西,因为它“不应该”重要,这只是我想用作图像灰度值的数字矩阵。
  • @MarkSetchell 我可以上传我使用pyplot 保存的图片的原始比例 28x28 版本,但它看起来就像噪点。
  • 您可能需要np.squeeze(),因为您的数组是 (28,28,1) 而不是 (28,28)。
  • 你检查过img.dtype()是np.uint8吗?

标签: python image numpy python-imaging-library


【解决方案1】:

您尝试从中创建 PIL 图像的数组已成形:

(28,28,1)

这不是 PIL 喜欢的形状。它喜欢:

(M,N) for greyscale images
(M,N,3) for RGB images
(M,N,4) for RGBA images

因此,您可以使用以下命令选择最后一个未使用维度的第一个通道:

img = np.array(pil_image.fromarray(img[...,0]).resize(intermediate_dim, pil_image.BICUBIC))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多