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
和 > 128
?128
本身呢?)
您可以通过在 skimage.transform.resize
调用中启用 preserve_range
标志来避免该问题:
mask = imresize(data, (width, height), order=3, preserve_range=True).astype('float32')
因此,您再次获得 [0.0 ... 255.0]
范围内的值,这应该类似于原始行为。
我正在尝试用 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
和 > 128
?128
本身呢?)
您可以通过在 skimage.transform.resize
调用中启用 preserve_range
标志来避免该问题:
mask = imresize(data, (width, height), order=3, preserve_range=True).astype('float32')
因此,您再次获得 [0.0 ... 255.0]
范围内的值,这应该类似于原始行为。