我目前实施了一种算法,该算法根据总变差计算视差图的质量评估。
我对python相对较新,但已经在加速numpy代码上读了很多线程。视图与花式索引,尝试使用Cython,嵌套循环的矢量化等。我实现了一些加速但完全,我在杂乱的代码中越来越多地结束而没有达到适当的加速。
我想知道是否有人可以给我一个提示,如果有一个干净简单的方法来加速这个2d循环。
TV是一个2D阵列,具有~15k x 15k元素 footprint_ix和_iy是2个数组列表,如果像素x,y以环形方式包含相邻像素的索引偏移量。当m = 1时,选择8个neighborpixel,m = 2,接下来的16个,依此类推
该算法对x,y的相邻像素求和,并在未超过阈值TAU时增加m。
我提出的最佳解决方案,到目前为止使用逐行多处理。
# create footprints
footprint_ix = []
footprint_iy = []
for m in range(1, m_classes):
fp = np.ones((2 * m + 1, 2 * m + 1), dtype = int)
fp [ 1 : -1, 1 : -1] = 0
i, j = np.nonzero(fp)
i = i - m
j = j - m
footprint_ix.append(i)
footprint_iy.append(j)
m_classes = 21
for x in xrange( 0, rows):
for y in xrange ( 0, cols):
if disp[x,y] == np.inf:
continue
else:
tv_m = 0
for m_i in range (0, m_classes-1):
m = m_i + 1
try:
tv_m += np.sum( tv[footprint_ix[m_i] + x, footprint_iy[m_i] + y] ) / (8 * m)
except IndexError:
tv_m = np.inf
if tv_m >= TAU:
tv_classes[x,y] = m
break
if m == m_classes - 1:
tv_classes[x,y] = m