python - 矢量化misc.imresize()时出现广播错误

标签 python numpy vectorization

我有一个 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])

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

关于python - 矢量化misc.imresize()时出现广播错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41159997/

相关文章:

python - 如何让这段 Python 代码运行得更快? [欧拉计划问题 #7]

python - 使用 Python 对 bool 数据进行快速索引和位翻转

python - 在python中从数独难题中提取网格

python - 如何使用矢量化从数组中选择最接近数组中值的值?

python - 在 Python 中使用 gtk.gdk 获取事件根窗口

python - 如何在 64 位组件上使用 win32api(或类似的)?

python - selenium.common.exceptions.WebDriverException : Message: 'chromedriver' executable needs to be in PATH

python - 在 numpy 结构化数组中存储单元信息的最佳方法?

r - 在列表中获取匹配索引的快速方法

python - Python 中嵌套 for 循环的向量化