Python 用于分割遮罩颜色映射的矢量化像素分配

Python 用于分割遮罩颜色映射的矢量化像素分配,python,numpy,opencv,vectorization,Python,Numpy,Opencv,Vectorization,我想给分割遮罩上色,这样它就可以被人看到 所以我有一个掩码M[y,x,1],其中每个元素都在0和n之间,其中n是分段掩码中的类的数量。此外,我有一个颜色表T[n,1,3],其中我将每个类映射到BGR中的一种颜色。最后,我有我的彩色掩模图像O[y,x,3],它应该有类的颜色值(定义在T中)(定义在M中) 我已通过以下代码以像素方式解决了此问题: def make_colour_mask(segment_mask): h = segment_mask.shape[0] w = segment_mas

我想给分割遮罩上色,这样它就可以被人看到

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

我已通过以下代码以像素方式解决了此问题:

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

但这种实现速度非常缓慢。忽略硬编码颜色表,这可以在以后提取:)

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

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\u表的创建拖动到此函数之外,并将其作为参数传递。此外,请确保
段掩码
CV_8UC1
CV_8UC3

cv2.LUT
,请参阅