scipy.misc.imresize 和 skimage.transform.resize 有什么区别?

What's the difference between scipy.misc.imresize and skimage.transform.resize?

我正在尝试用 skimage.transform.resize 替换一些使用 scipy.misc.imresize 的代码。但是,我很难理解一些对结果执行数学运算的代码:

import os
import numpy as np
from PIL import Image
from skimage.transform import resize as imresize

# load the image
filename = os.path.join('silhouettes', 'cat.jpg')
image = Image.open(filename)

data = np.asarray(image)
width, height, _ = data.shape
mask = imresize(data, (width, height), order=3).astype('float32')
print(type(mask))

# Perform binarization of mask
mask[mask <= 127] = 0
mask[mask > 128] = 255

# numpy.amax
# Return the maximum of an array or maximum along an axis.
max = np.amax(mask)
print(max)

# RuntimeWarning: invalid value encountered in true_divide
# Attempt to divide an numpy.ndarray by 0
mask /= max

评论记录了我遇到的错误:max 值为 0,最后我试图除以 0。作为参考,原始函数是:

def load_mask_sil(invert_sil, shape):
    width, height, _ = shape
    mask = imresize(invert_sil, (width, height), interp='bicubic').astype('float32')

    # Perform binarization of mask
    mask[mask <= 127] = 0
    mask[mask > 128] = 255

    max = np.amax(mask)
    mask /= max

    return mask

根据 skimage.transform.resize 上的文档,输出中的值被缩放到区间 [0.0 ... 1.0],而我假设 scipy.misc.imresize 没有更改数据类型或根本没有值(我手头没有这么旧的 scipy 版本来验证)。

因此,在原始版本中,您的值很可能在 [0.0 ... 255.0] 范围内,有些值在 128 以上,因此最大值为 255。在新版本中,您只有 [0.0 ... 1.0] 范围内的值,因此所有像素都将设置为 0,因为它们都低于 127。 (旁注:为什么 <= 127> 128128 本身呢?)

您可以通过在 skimage.transform.resize 调用中启用 preserve_range 标志来避免该问题:

mask = imresize(data, (width, height), order=3, preserve_range=True).astype('float32')

因此,您再次获得 [0.0 ... 255.0] 范围内的值,这应该类似于原始行为。