scipy.misc.imresize() 的替代方案

Posted

技术标签:

【中文标题】scipy.misc.imresize() 的替代方案【英文标题】:Alternative to scipy.misc.imresize() 【发布时间】:2019-12-16 06:20:21 【问题描述】:

我想使用一个仍然使用 scipy.misc.imresize() 的旧脚本,它不仅被弃用,而且完全从 scipy 中删除。相反,开发人员建议使用numpy.array(Image.fromarray(arr).resize())skimage.transform.resize()

不再工作的确切代码行是这样的:

new_image = scipy.misc.imresize(old_image, 0.99999, interp = 'cubic')

不幸的是,我不再完全确定它到底做了什么。恐怕如果我开始使用旧的 scipy 版本,我的新脚本将停止工作。 我一直将它用作模糊滤镜的一部分。如何使numpy.array(Image.fromarray(arr).resize())skimage.transform.resize() 执行与上述代码行相同的操作?抱歉,我提供的信息不足。

编辑

我已经能够确定这条线的作用。它从此转换图像数组:

[[[0.38332759 0.38332759 0.38332759]
  [0.38770704 0.38770704 0.38770704]
  [0.38491378 0.38491378 0.38491378]
  ...

到这里:

[[[57 57 57]
  [59 59 59]
  [58 58 58]
  ...

编辑2

当我使用 jhansens 方法时,输出是这样的:

[[[ 97  97  97]
  [ 98  98  98]
  [ 98  98  98]
  ...

我不明白 scipy.misc.imresize 做了什么。

【问题讨论】:

【参考方案1】:

要添加此内容,您可以导入 Pillow.Image。但是,在我正在进行的一个项目中,我发现skimage.transform.resize 与两者具有相同的效果,不需要在末尾转换为ndarray,因为这是返回类型...

因此,如果您希望在末尾添加一个图像对象,Pillow 可能更有用,但如果您想要一个数组,则可能使用 skimage.transform

例如,将图像缩小 4 倍:

from skimage.transform import resize

//You already have an image of shape (256,256,3) you are putting into a function
def my_downscale(image_shape):
    downscaled = resize(image_shape, [image_shape // 4, image_shape // 4])
    return downscaled

这将返回(64,64,3)ndarray,因为您没有包括它保留的最后一个维度通道,即 3。 相对于:

from PIL import image

def my_downscale_pillow(image_shape):
    downscaled = np.array(Image.fromarray(image_shape).resize([image_shape[0] // 4, 
        image_shape[1] // 4))

【讨论】:

【参考方案2】:

张量流 1:

image = np.array(ndimage.imread(fname, flatten=False))
image = np.array(im)
image = image/255.
my_image = scipy.misc.imresize(image, size=(64,64)).reshape((1, 64*64*3)).T
my_image_prediction = predict(my_image, parameters)

张量流 2:

import imageio
im = imageio.imread(fname)
image = np.array(im)
image = image/255.
num_px = 64
my_image = image.reshape((1, num_px*num_px*3)).T # WITHOUT RESIZE
my_image_prediction = predict(my_image, parameters)

【讨论】:

【参考方案3】:

只做一件事 解决了所有版本 2 的问题

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

【讨论】:

【参考方案4】:

Scipy Official Docs

imresize 现已弃用! imresize 在 SciPy 1.0.0 中已弃用,并将在 1.3.0 中删除。请改用 Pillow:numpy.array(Image.fromarray(arr).resize()).

from PIL import Image
resized_img = Image.fromarray(orj_img).resize(size=(new_h, new_w))

【讨论】:

补充一点,这个resize 模块会给我们PIL.Image.Image 对象。要获取 numpy 数组,resized_img = np.array(resized_img)【参考方案5】:

几乎看起来那条线是一种将数组从 0..1 比例转换为 0..255 的方式,无需任何实际调整大小。如果是这种情况,您可以简单地执行以下操作:

new_image = (old_image * 255).astype(np.uint8)

但是,我确实意识到您的第一个示例数组中的浮点数与第二个示例数组中的整数不太匹配...

更新:如果您将重新缩放到 0..255 与调整大小操作相结合,例如jdehesa 在他们的回答中指出的其中一种方式,您将重现您的预期结果(直至舍入错误)。但是,在不了解您的代码的情况下,我无法想象它的功能取决于将图像大小调整这么少,这就是为什么我猜测这行代码的目的是将图像转换为 0 ..255(最好按照上面的方法完成)。

【讨论】:

你是对的。我不知道我的价值观是如何形成的。 scipy.misc.imresize 在窗帘后面做点什么。【参考方案6】:

您可以查找已弃用函数的documentation 和source code。简而言之,使用Pillow (Image.resize) 你可以这样做:

im = Image.fromarray(old_image)
size = tuple((np.array(im.size) * 0.99999).astype(int))
new_image = np.array(im.resize(size, PIL.Image.BICUBIC))

使用skimage (skimage.transform.resize) 你应该得到相同的结果:

size = (np.array(old_image.size) * 0.99999).astype(int)
new_image  = skimage.transform.resize(old_image, size, order=3)

【讨论】:

@jdehesa 谢谢你的努力。请查看编辑部分。我尝试使用您的两种方法,但输出数组与输入数组完全相同。缺了点什么。我希望编辑部分有所帮助。 @ArturMüllerRomanov 该函数将输入图像缩小 0.99999 倍。除非图像非常大(100,000 像素高或宽),这意味着它只会删除每个维度中的一个像素(由于浮点截断)。在大多数情况下,两个图像看起来应该是一样的,只是尺寸略有不同。我很确定您在更新后的帖子中显示的两个数组之间的转换不是由您提到的函数产生的。

以上是关于scipy.misc.imresize() 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

ETF替代规则

替代拉链的替代方式

python实现替代密码与置换密码

Markdown 替代品 Asciidoc 介绍

C# 中怎么应用JSON来替代之前的webservice??

如何强制MonoDevelop的建设使用替代单安装