首页 > 解决方案 > 为分割掩码的颜色映射矢量化像素分配

问题描述

我想为分割蒙版着色,以便人类可以看到。

所以我有一个掩码 M[y,x,1],其中每个元素都介于 0 和 n 之间,其中 n 是分段掩码中的类数量。此外,我有一个颜色表 T[n,1,3] 我将每个类映射到 BGR 中的一种颜色。最后,我有我的彩色蒙版图像 O[y,x,3],它应该具有类(在 M 中定义)的颜色值(在 T 中定义)。

我已经用以下代码解决了它的像素问题:

def make_colour_mask(segment_mask):
h = segment_mask.shape[0]
w = segment_mask.shape[1]

colour_mask = cv2.cvtColor(segment_mask, cv2.COLOR_GRAY2BGR)

colour_table = [[0,0,0],[255,255,255],[255,0,0],[0,255,0],[0,0,255],[255,0,255],[255,255,255]]

# loop over the image, pixel by pixel
for y in range(0, h):
    for x in range(0, w):
        colour_mask.itemset((y, x, 0), colour_table[segment_mask.item(y,x)][0])
        colour_mask.itemset((y, x, 1), colour_table[segment_mask.item(y,x)][1])
        colour_mask.itemset((y, x, 2), colour_table[segment_mask.item(y,x)][2])

return colour_mask

但是这个实现非常慢。忽略硬编码的颜色表,这可以稍后提取:)

标签: pythonnumpyopencvvectorization

解决方案


cv2.LUT按照@Miki 的建议使用解决。

def make_colour_mask(segment_mask):
    colour_table = np.zeros((256, 1, 3), dtype=np.uint8)
    colour_table[0] = [0, 0, 0]
    colour_table[1] = [255, 255, 255]
    colour_table[2] = [255, 0, 0]
    colour_table[3] = [0, 255, 0]
    colour_table[4] = [0, 0, 255]
    colour_table[5] = [255 ,0 ,255]
    colour_table[6] = [0, 255 ,255]

    colour_mask = cv2.applyColorMap(segment_mask, colour_table)

    return colour_mask

当然你可以拖动colour_table这个函数外部的创建并将它作为参数传递。另外,请确保segment_maskCV_8UC1CV_8UC3


推荐阅读