<p>不必在每一行和每列上循环,您可以左、右、上、下移动数组以获得适当数量的元素。每次移位时,您都将值累积到基数组中。在移动和累积之后,你计算你的平均值并应用你的阈值返回一个掩码。请看这个<a href="https://stackoverflow.com/a/4937418/673590">post</a>,它对这个主题进行了一般性的讨论。这个想法是利用numpy的广播功能,它将一个函数或运算符应用于C语言中数组的所有元素,而不是Python。在</p>
<p>我已经修改了链接帖子中的代码,以适应我相信你正在努力实现的目标。在任何情况下,总的模式应该会加快速度。你必须弄清楚如何处理返回遮罩中的边。这里我简单地将返回掩码设置为False,但是您也可以通过在每个方向上扩展输入数据一个像素并填充最近的像素、零、灰色等来消除边缘</p>
<pre><code>def findRegions(self,data):
#define the shifts for the kernel window
shifts = [(-1,0),(0,-1),(0,1),(1,0)]
#make the base array of zeros
# array size by 2 in both dimensions
acc = numpy.zeros(data.shape[:2])
#compute the square root of the sum of squared color
# differences between a pixel and it's
# four cardinal neighbors
for dx,dy in shifts:
xstop = -1+dx or None
ystop = -1+dy or None
#per @Bago's comment, use the sum method to add up the color dimension
# instead of the list comprehension
acc += ((data[1:-1,1:-1] - data[1+dx:xstop, 1+dy:ystop])**2).sum(-1)**.5
#compute the average
acc /= (len(shifts) + 1)
#build a mask array the same size as the original
ret = numpy.zeros(data.shape[:2],dtype=numpy.bool)
#apply the threshold
# note that the edges will be False
ret[1:-1,1:-1] acc < self.threshold
return ret
</code></pre>