如何解决scipy.misc.imresize 和 skimage.transform.resize 有什么区别?
我正在尝试用 scipy.misc.imresize
替换一些使用 skimage.transform.resize
的代码。但是,我很难理解一些对结果进行数学运算的代码:
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,_ = shape
mask = imresize(invert_sil,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
本身呢?)
您可以通过在 preserve_range
调用中启用 skimage.transform.resize
标志来规避该问题:
mask = imresize(data,(width,height),order=3,preserve_range=True).astype('float32')
因此,您再次获得 [0.0 ... 255.0]
范围内的值,这应该类似于原始行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。