python - 使用map()函数优化速度

标签 python python-2.7 image-processing

所以我目前有一个项目,我必须通过卫星图像模拟高分辨率图像。我正在使用 Python 执行此操作,并且我有一个可以运行的程序 - 但是,需要 3 分钟才能模拟典型的图像尺寸(1200 x 1500 像素)。我一直在测试代码的时间,发现这是脚本中最耗时的部分,需要 3 分钟(代码的其余部分大约需要 10 秒)。

这是该部分代码:

def weight_values(Pix_center,row_0,row_1,col_0,col_1,t_row_0,t_row_1,t_col_0,t_col_1):
    foot_in_truth = foots[Pix_center,row_0:row_1,col_0:col_1]
    truth_in_foot = truth[t_row_0:t_row_1, t_col_0:t_col_1]
    weighted_vals = (foot_in_truth*truth_in_foot).sum()/foot_in_truth.sum()
    return weighted_vals

no_mask = np.where(np.ma.getmaskarray(Pix_centers) == False)
weighted_mean = np.array(map(weight_values, (Pix_centers[no_mask]),(row0[no_mask]),(row1[no_mask]),(col0[no_mask]),(col1[no_mask]),(truth_row0[no_mask]),(truth_row1[no_mask]),(truth_col0[no_mask]),(truth_col1[no_mask])))

在上面,我的 weight_values 函数需要很多值。当使用 ma​​p 调用它们时,给出的可迭代对象都是相同大小的一维对象。

以下是所涉及数组的简要说明:

  • foots:一个 3D 数组,其尺寸为像素数、沿轨道和跨轨道(最后两个是非本地化的,即它们以 0 为中心)。这表示卫星在每个像素处的足迹。足迹本质上是每个像素内实际有多少区域 - 我使用的仪器有很大的 strip ,这就是为什么这很重要。
  • 真相:这就是我正在模拟的事情。它的分辨率与脚相同,但覆盖了沿轨迹和跨轨迹坐标上的特定区域

在映射函数中作为迭代调用的一维数组具有掩码值,这就是使用“no_mask”的原因。这些数组的最大值为 1800000(图像像素数),但我的代码允许我选择较小的段进行测试。

这个方法有效!但我想知道是否有什么办法可以加快速度。到目前为止,我已经尝试过使用 map/lambda 设置(几乎慢了两倍)、列表理解和 for 循环。到目前为止,这种方法是我整个 180 万像素样本中最快的。如果您对如何加快速度有任何想法,请告诉我。我会在这里发布整个代码,但其中很多都是无关紧要的,而且它使用我本地计算机上的文件,我不确定我是否有权共享。

如果这里有任何不清楚的地方或者您不理解这个问题,也请告诉我,我会尽力使其更具可读性。

最佳答案

我快速浏览了您的 weight_value 函数,该函数对每个像素进行平均,并且每个像素都有许多邻居。因此,每个相邻像素被读取多次。这需要 O(n^3) 时间运行。一种常见的、更快的技术是累积和。您可以从this example开始,尽管它是在 Matlab 中。 python 中的想法是一样的。目标是您只需计算每个像素值一次。 python版本是here .

关于python - 使用map()函数优化速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53067314/

相关文章:

image - 如何在 OpenCV 中计算一个点的 3D 坐标

matlab - 车牌自动识别系统

opencv - 提高低质量扫描图像的 OCR 质量

python - 基维错误: NameError 'Clock' is not defined

python - Flask 中的 Websocket

python - Python中的似然比检验

python-2.7 - 使用 Scipy 的 coo_matrix.todense() 的 Python TypeError

python - 使用 pandas 根据值按日期对数据进行分组

python - 随机数生成 python 3.x 默认库

Python For 循环列表,每 5 分钟运行一次