向量化misc.imresize()时的广播错误

时间:2016-12-15 08:55:50

标签: python numpy vectorization

我有一个由多个相同大小的图像[N_images,width,height,3]组成的numpy数组A.

我希望以最快的方式将misc.imresize()应用于每个人和每个人。

所以我定义了:

def myfunc(x):
  return misc.imresize(x,(wanted_width,wanted_height))

然后我做了:

vfunc=np.vectorize(my_func)

但是当我尝试时:

test=vfunc(A)

我得到了一个不合适的数组形状转换成图像错误。 我认为这是因为我没有指定op应该向量化的轴,这导致它不按照想要的方式广播数组ops所以我尝试了另一件事来缩小错误:

test=np.apply_along_axis(my_func,0,A)

并得到了同样的错误。 即使我强制将np.squeeze()强制转换为my_func。这真让我感到惊讶。

编辑:我也尝试过map同样的错误。 它可能源于这样一个事实:你只能使用带有标量函数的矢量化,如@jotasi所指出的那样。

一定很傻但我不知道发生了什么。有人可以开导我吗?有办法解决吗?

1 个答案:

答案 0 :(得分:3)

使用scipy的zoom还有另一种矢量化方法。但是,对于少量图像来说不一定更快(例如,对于N = 100,循环可能更快)。

>>> from skimage import color, util, data
>>> img = util.img_as_float(color.gray2rgb(data.camera())) # Sample RGB image

我只是在RGB通道上复制了灰度图像,所以它仍然看起来是灰度的,但实际上它是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])

enter image description here

查找缩放因子:

>>> 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)

enter image description here

再次注意,尽管它是矢量化版本,但它使用NN插值才能快速,标准循环+任意插值可能会更快。把它作为概念的证明,看看它是否适合你。