python - 为分割掩码的颜色映射矢量化像素分配
问题描述
我想为分割蒙版着色,以便人类可以看到。
所以我有一个掩码 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
但是这个实现非常慢。忽略硬编码的颜色表,这可以稍后提取:)
解决方案
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_mask
是CV_8UC1
或CV_8UC3
。
推荐阅读
- matlab - 如何防止表值中的精度损失?
- .net - Office365 和 Visual Studio 2010 是否有 PIA?
- snowflake-cloud-data-platform - 我需要为 Snowflake 和 On Premise 之间的数据传输付费吗?
- css - 垂直滚动条可见性
- vba - 如何在电子邮件末尾嵌入照片?
- javascript - Safari浏览器中的Jquery datepicker错误
- flask - 使用 Flask 中的 HTTP 307 临时重定向将文件上传到第三方 API
- qt - 非 html 内容的 QTextDocument 样式表
- sql - pyodbc MS Access Driver 语法错误,但语法看起来正确
- opc - 为什么ignition的OPC UA不是基于OPC Foundation?