我正在研究numpy stride-tricks非重叠块,它们是从大小为400x400的图像生成的。因此,为了从图像中获得40x40块,单个块的大小将是10x10像素,因此,图像的最后一个像素将读取如下所示 - [39,39,9,9]。现在,问题在于我想算不上。完整的白色块,即如果在一个块中所有10x10像素都是255,那么它将是一个白色块,因此while块的计数会增加。我在时间消耗代码方面使用了一个非常简单但代价高昂的代码:
blocks = numpy.lib.stride_tricks.as_strided(image, shape=shape, strides=strides)
counter = 0 ##### Counting the white blocks
for i in range(40):
for j in range(40):
c = 0
for k in range(10):
for l in range(10):
if blocks[i,j,k,l] ==255:
c = c + 1
if c ==100:
counter = counter +1
有一种漂亮而有效的方法吗?或者任何可用的内置功能对此有帮助?与我的其余代码相比,这段代码需要很长时间,所以我需要一个解决方法... plz help..thanks
答案 0 :(得分:2)
您的块没有重叠,因此不存在生成巨大中间阵列的真正风险。只需在布尔数组的最后两个轴上调用np.all
,将图像与255
np.count_nonzero((blocks == 255).all(axis=(-1, -2)))
如果你正在使用numpy< 1.7然后你必须这样做:
np.count_nonzero((blocks == 255).all(axis=-2).all(axis=-1))