我有一个(n, height, width)
形状的NumPy矩阵,包含uint8
范围内的灰度图像。每层(总共n层)包含一个神经网络预测。我想比较所有的n layers
,并为每个像素获得第二个最常见的值,并用这个新值创建一个新的(height, width)
形状矩阵。换句话说,我使用每像素投票从分层矩阵中的所有矩阵创建一个新的2D矩阵。我更喜欢第二个最常见的值,因为最常见的值是3,出于不同的原因,我想忽略这一点;这就是为什么我用mode(vote[vote != 3], axis=None)[0][0]
搜索第二个最常见的值。以下是一个可行的解决方案。但是,它不是很快,因为我必须缓慢地迭代。我想使用矢量化解决方案来节省时间
import numpy
from scipy.stats import mode
n = 84
height = 1872
width = 3128
layered_image = numpy.ndarray(shape=(n, height , width), dtype=numpy.uint8)
image = numpy.ndarray(shape=(height , width), dtype=numpy.uint8)
for i in range(0, height):
for j in range(0, width):
vote = []
for k in range(len(layered_image)):
vote.append(layered_image[k][i][j])
vote = numpy.asarray(vote, dtype=numpy.uint8)
image[i][j] = mode(vote[vote != 3], axis=None)[0][0]
谢谢你的建议
多亏了Divakar,
bincounting
方法对我来说非常有效。为了防止在处理大量层时过度使用RAM,我在这个方法中添加了切片。这有点慢,但它允许在内存较少的机器上进行处理;假设slice_coordinates
是一个列表,包含所有图像块的左上角坐标,这些图像块位于(y, x)
、prediction_overlay
三维分层图像和prediction_mask
新二维图像的元组中,切片工作如下:一种方法是外部广播平等-
另一种是掩模处理-
另一个带有
2D bincount
-相关问题 更多 >
编程相关推荐