因此,我目前有一个项目,必须通过卫星图像模拟高分辨率图像。我正在使用Python进行此操作,并且我有一个有效的程序-但是,要在典型的图像尺寸(1200 x 1500像素)上进行仿真需要3分钟。我一直在测试代码的时间,发现这是脚本中最耗时的部分,需要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 函数具有很多值。当使用 map 调用它们时,给出的可迭代对象都是相同大小的所有一维对象。
这里是有关数组的简要说明:
在地图函数中作为可迭代对象调用的一维数组具有掩码值,这就是为什么使用'no_mask'的原因。这些数组的最大值为1800000(图像像素数),但是我的代码允许我选择较小的分段进行测试。
此方法有效!但是我想知道是否有任何方法可以加快速度。到目前为止,我已经尝试过使用map / lambda设置(速度慢了将近两倍),列表理解和for循环。到目前为止,在我整个180万像素样本中,这种方法是最快的。如果您对如何加快速度有任何想法,请告诉我。我将在此处发布整个代码,但其中很多都无关紧要,而且它使用本地计算机上的文件,但我不确定我是否有权共享。
也请让我知道此处是否不清楚或您不理解该问题,我将尽力使它更具可读性。
答案 0 :(得分:3)
我快速浏览了您的weight_value
函数,该函数对每个像素进行平均,并且每个像素有很多邻居。因此,每个相邻像素被读取多次。这需要O(n ^ 3)时间。一种常见的更快的技术是累积和。您可以从this example开始,尽管它在Matlab中。这个想法在python中是相同的。目标是您只需要计算一次每个像素值。
python版本是here。