我正在用Python/NumPy实现用于颜色分割的mean图像处理算法的一个版本。
我编写了一个纯NumPy版本的每个像素的实际平均偏移量(我认为这是大部分时间所花费的时间)。它将RGB值的数组从父图像中分割出来,然后创建下限和高界RGB参考数组,并为像素生成一个布尔掩蔽数组,用于平均和平均值。
还有进一步的优化吗?我怀疑,将x/y循环矢量化可能会加快速度,但对我的生活而言,但我还不知道如何实现。(有些人是如何生成每个像素网格的数组来工作的,然后将均值移位推广到接收数组输入?)gL是网格长度。gS是gL平方--网格中的像素数。
for itr in xrange(itrs):
if itr != 0:
img = imgNew
for x in xrange(gL,height-gL):
for y in xrange(gL,width-gL):
cGrid = img[x-gSmp:(x+gSmp+1),y-gSmp:(y+gSmp+1)]
cLow,cUp = np.empty((gL,gL,3)),np.empty((gL,gL,3))
cLow[:] = [img[x,y][0]-tol,img[x,y][1]-tol,img[x,y][2]-tol]
cUp[:] = [img[x,y][0]+tol,img[x,y][1]+tol,img[x,y][2]+tol]
cBool = np.any(((cLow < cGrid) & (cUp > cGrid)),axis=2)
imgNew[x,y] = np.sum(cGrid[cBool],axis=0)/cBool.sum()发布于 2012-11-22 13:25:27
下面的代码是第一次尝试,但仍未被矢量化。这里的要点是提取创建cLow和cUp (不要在循环中创建数组,总是“预先分配”内存),公差级别的计算可以在一次操作中完成(假设此时广播是可能的),最后我删除了将imgNew复制到img的条件情况(我也怀疑您不想将最后一次迭代复制回img。如果是这样,则必须删除循环之前的复制行,并将循环开始处的副本移到其末尾。)。
diff_height_gL = height - gL
diff_width_gL = width - gL
sum_gSmp_one = gSmp + 1
cLow, cUp = np.empty((gL, gL, 3)), np.empty((gL, gL, 3))
imgNew = img.copy()
for itr in xrange(itrs):
img[:] = imgNew
for x in xrange(gL, diff_height_gL):
for y in xrange(gL, diff_width_gL):
cGrid = img[x-gSmp:(x + sum_gSmp_one), y-gSmp:(y + sum_gSmp_one)]
cLow[:] = img[x, y, :] - tol
cUp[:] = img[x, y, :] + tol
cBool = np.any(((cLow < cGrid) & (cUp > cGrid)), axis=2)
imgNew[x, y] = np.sum(cGrid[cBool], axis=0) / cBool.sum()这个问题似乎完全可以进行多重处理。这可以作为矢量化的替代/扩展。如果我有时间我会尝试矢量化..。
类甲壳虫
https://codereview.stackexchange.com/questions/18149
复制相似问题