我有一个 numpy 数组 A,由多个相同大小的图像组成 [N_images,width,height,3]。
我想以最快的方式将 misc.imresize()
应用于每个人。
所以我定义:
def myfunc(x):
return misc.imresize(x,(wanted_width,wanted_height))
然后我做了:
vfunc=np.vectorize(my_func)
但是当我尝试时:
test=vfunc(A)
我收到不适合转换为图像的数组形状错误。 我认为这是因为我没有指定操作应该矢量化的轴,这导致它没有按照想要的方式广播数组操作,所以我尝试了另一种方法来缩小错误范围:
test=np.apply_along_axis(my_func,0,A)
并得到同样的错误。 即使我强制将 np.squeeze() 放入 my_func 中。这真让我惊讶。
编辑:我也尝试使用map
相同的错误。
这可能源于这样一个事实:正如 @jotasi 所指出的,您只能将向量化与标量函数一起使用。
这一定很愚蠢,但我不知道发生了什么。有人可以启发我吗?有办法解决吗?
最佳答案
还有一种使用 scipy 的替代矢量化方法 zoom 。但是,对于少量图像来说,它不一定更快(例如,对于 N=100,循环可能会更快)。
>>> from skimage import color, util, data
>>> img = util.img_as_float(color.gray2rgb(data.camera())) # Sample RGB image
我只是在 RGB channel 上复制了灰度图像,因此它看起来仍然是灰度的,但实际上是 RGB 的。
通过复制上面的 RGB 图像及其水平翻转来创建 100 个 RGB 图像(以确保插值正常工作)。
>>> data = np.empty((100,) + img.shape, img.dtype)
>>> data[0::2] = img
>>> data[1::2] = img[:,::-1]
>>> plt.imshow(data[50])
查找缩放系数:
>>> from scipy.ndimage import zoom
>>> new_size = (200, 200)
>>> fy, fx = np.asarray(new_size, np.float32) / data.shape[1:3]
调整图像大小,因子 1
表示在该轴上没有插值:
>>> resized = zoom(data, (1, fy, fx, 1), order=0) # order=0 for quicker
>>> plt.imshow(resized[50]) # resized.shape = (100, 200, 200, 3)
再次请注意,虽然它是矢量化版本,但它使用 NN 插值来快速,标准循环 + 任意插值可能会更快。以此作为概念证明,看看它是否适合您。
关于python - 矢量化misc.imresize()时出现广播错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41159997/