【问题标题】:Broadcasting error when vectorizing misc.imresize()矢量化 misc.imresize() 时出现广播错误
【发布时间】:2017-04-30 19:26:33
【问题描述】:

我有一个由多个相同大小的图像 [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)

我收到一个 not-suitable-array-shape-for-converting-into-images 错误。 我认为这是因为我没有指定操作应该向量化的轴,这导致它没有以想要的方式广播数组操作,所以我尝试了另一种方法来缩小错误范围:

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

并得到同样的错误。 即使我强制将 np.squeeze() 放入 my_func。这让我很惊讶。

编辑:我也试过map同样的错误。 正如@jotasi 所指出的那样,这可能源于您只能将矢量化与标量函数一起使用。

这一定很愚蠢,但我不知道发生了什么。有人可以启发我吗?有办法解决吗?

【问题讨论】:

  • np.vectorize 没有 axis 参数,因为它仅用于不支持 numpy 且采用标量的函数。详情请见this answer
  • 谢谢,我不知道!那么我应该放弃尝试矢量化它还是有其他方法?
  • 我认为没有一种简单的方法可以避免执行某种循环,因为misc.imresize 也不支持沿轴的矢量化应用程序。如果你的图像足够大,我猜,循环不应该代表瓶颈。
  • 好的,如果有共识,我明天将结束我的问题。
  • 是的。当然,我也可能会弄错。让我们看看其他人是否有什么想法。

标签: python numpy vectorization


【解决方案1】:

还有一种使用 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 插值以便快速,标准循环 + 任意插值可能会更快。将此作为概念证明,看看它是否适合您。

【讨论】:

  • 感谢您的回答!我投了赞成票。我将为我的实现进行基准测试,看看会发生什么。
  • 但我并不真正关心插值的类型,只要图像看起来不错,而且我有大约 500000 张图像,所以它可能确实更快。
  • 我不能使用 NN 插值,因为人工制品对我的应用程序来说太重要了,当我将样条线的顺序推到 1 时,没有加速。
  • @jean 没问题!感谢您的反馈,我实际上并没有对这种方法进行基准测试。
  • 它并没有更快(甚至可能更慢)的事实是因为,即使它在实践中只是进行 2D+颜色插值,该函数也在尝试执行 4D 插值。设置为1 的因子可防止对这些轴进行插值,但我强调它必须每次都进行检查。或者换句话说,N 次 2D+color 插值比上面带约束的 N-D 插值优化得更好。
猜你喜欢
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多