我有一个由多个相同大小的图像[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所指出的那样。
一定很傻但我不知道发生了什么。有人可以开导我吗?有办法解决吗?
答案 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])
查找缩放因子:
>>> 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插值才能快速,标准循环+任意插值可能会更快。把它作为概念的证明,看看它是否适合你。