Python 3.x scipy.misc.imresize()的替代方案
我想使用一个仍然使用Python 3.x scipy.misc.imresize()的替代方案,python-3.x,numpy,scipy,scikit-image,Python 3.x,Numpy,Scipy,Scikit Image,我想使用一个仍然使用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.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]
...
Edit2
当我使用jhansens方法时,输出如下:
[[[ 97 97 97]
[ 98 98 98]
[ 98 98 98]
...
我不知道scipy.misc.imresize能做什么。您可以查找不推荐使用的函数的和。简而言之,使用()可以执行以下操作:
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))
对于()您应该得到与以下相同的结果:
size = (np.array(old_image.size) * 0.99999).astype(int)
new_image = skimage.transform.resize(old_image, size, order=3)
这条线看起来像是一种不经过任何实际调整就可以将数组从0..1比例转换为0..255比例的黑客方法。如果是这种情况,您可以简单地执行以下操作:
new_image = (old_image * 255).astype(np.uint8)
但是,我确实意识到第一个样本数组中的浮点数与第二个样本数组中的整数不太匹配
更新:如果您将重新缩放到0..255与调整大小操作相结合,例如jdehesa在其回答中指出的方法之一,您将重现预期结果(最多四舍五入错误)。但是,在不了解代码其他内容的情况下,我无法想象它的功能依赖于将图像大小调整如此之小,这就是为什么我猜测这行代码的目的是将图像转换为0..255(最好如上所述)。
imresize现在已被弃用imresize在SciPy 1.0.0中不推荐使用,并将在1.3.0中删除。改用枕头:
numpy.array(Image.fromarray(arr.resize())
只要做一件事
这解决了所有版本2的问题
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
Tensorflow 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)
Tensorflow 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)
若要添加此项,可以导入。然而,在我正在进行的一个项目中,我发现它与两者具有相同的效果,不需要在最后转换为
ndarray
,因为这是返回类型
因此,如果您希望在枕头
的末尾有一个图像对象,则可能更有用,但如果您是在数组后面,则可以使用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))
@谢谢你的努力。请看一下编辑部分。我尝试使用这两种方法,但输出数组与输入数组完全相同。有些东西不见了。我希望编辑部分能有所帮助。@ArturMüllerRomanov该函数将输入图像缩小0.99999倍。除非图像非常大(100000像素高或宽),否则这意味着它将只删除每个维度中的一个像素(由于浮点截断)。在大多数情况下,两幅图像的外观应该相同,只是尺寸略有不同。我很确定你在更新的帖子中展示的两个数组之间的转换不是由你提到的函数产生的。你是对的。我不知道我的价值观是如何形成的
scipy.misc.imresize
在窗帘后面做了一些事情。要添加,此resize
模块将为我们提供PIL.Image.Image
对象。要获取numpy数组,请使用调整大小的\u img=np.array(调整大小的\u img)
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))