有效地将值映射到具有相同标签的像素

时间:2019-06-28 07:28:30

标签: python mapping

我正在尝试创建一个图像,其中每个色块中的所有像素(即具有相同标签的每组像素)都具有相同的值(先前已计算出)。换句话说,我有:

  • 标签矩阵/图像“ L”,其中每个像素的值是为其分配的标签;
  • 向量“ V”,其长度等于标签的数量,并包含将像素映射到的值;

我想创建一个新的矩阵/图像,其中每个像素的“ V”值与“ L”中的标签相对应。

我已经尝试了一种显而易见的方法,即遍历每个标签,找到带有该标签的像素,并在V中为其分配相应的值:

L= [[0,0,0,1,1,1,1,2],
    [0,0,1,1,1,2,2,2],
    [0,0,0,1,1,1,2,2],
    [0,0,1,1,2,2,2,2]]
L = np.array(L)
V = [7,8,9]
totLabel = np.amax(L)
result = np.zeros( (L.shape), dtype=np.float32 )
for idx in range(0,totLabel):
    result += (L==idx)*V[idx]

这可以正常工作,在某种意义上说,结果符合预期:

result:
[[7,7,7,8,8,8,8,9],
 [7,7,8,8,8,9,9,9],
 [7,7,7,8,8,8,9,9],
 [7,7,8,8,9,9,9,9]]

问题在于,现在我需要将此图像放大到11000x11000大小的图像。这使它非常慢,因为在每次迭代时,我的代码都会分配一个新的大小为numpy的numpy矩阵(label == idx)并取消分配,因此我不得不针对150k个唯一标签重复此过程。

编辑:添加了示例值和预期的输出。

1 个答案:

答案 0 :(得分:1)

您可以使用boolean indexing这样操作:

labels = np.unique(L)
L_copy = L.copy()

for label in labels:
    mask = (L_copy==label)
    L[mask] = V[label]

这直接修改了L。如果您不希望这样做,则需要先复制阵列。