cel*_*ini 2 python arrays numpy image-processing
我有一个 numpy 数组,由 20,000 个 RGB 图像组成,每个图像的像素为 220x220。因此,数组 的X_data形状为(20000, 220, 220, 3)。
我正在寻找最快的方法来查找整个数据集中的最小和最大像素值。我知道这种类型的任务需要时间,因为我正在搜索大约 30 亿个像素值,但我希望改进我已经找到的解决方案;以下是:
对结果数组使用np.flattenand 然后:np.minnp.max
flat = X_data.flatten()
np.min(flat)
np.max(flat)
Run Code Online (Sandbox Code Playgroud)
此方法总共花费了 13 分 11 秒(墙上时间)来查找最小值和最大值。
使用np.amin和np.amax查找每个图像的最小值和最大值,将它们附加到列表中,然后查找该列表的最小值和最大值:
min_val = np.min([np.amin(X_data[i]) for i in np.arange(X_data.shape[0])])
max_val = np.max([np.amax(X_data[i]) for i in np.arange(X_data.shape[0])])
Run Code Online (Sandbox Code Playgroud)
此方法总共花费了 8 分钟(墙上时间)。
有没有更快的方法来完成这项任务?
我忘记在问题的原始表述中提到,我希望它适用于尚未重新缩放的图像数据集,即包含不同大小图像的图像数据集。这意味着使用np.minandnp.max将不起作用,即使它比上述选项更快。
非常感谢!
如果最大速度很重要,那么添加可以同时获取最大值和最小值的库可能是值得的。这样的例程只需要遍历大数组一次而不是两次。由于在任何现代平台上获取这些值都是完全受内存限制的(计算量很小),因此将内存访问减半可能会使执行时间减半。基本上,您可以用一种的价格获得两种价值。
这个答案有一个链接到 Python 的 Fortran 实现,并且发现 Numpy 函数也非常慢。但这是 8 年前的答案,Numpy 实现中的情况可能有所改善。
DIPlib是一个图像处理库(我是一名作者),因为我已经安装了它,所以我很容易尝试它的功能来获取数组中的最大值和最小值。我使用的数组比OP中的数组小,我不想等待那么长时间才能完成实验。这是代码:
import numpy as np
import diplib as dip
import time
X = np.random.randn(2000, 220, 220, 3)
t = time.time()
np.min(X), np.max(X)
print(time.time() - t)
t = time.time()
dip.MaximumAndMinimum(X)
print(time.time() - t)
Run Code Online (Sandbox Code Playgroud)
三次运行的中位数(不更改数组X)第一部分为 0.361 秒,第二部分为 0.135 秒。