gpt4 book ai didi

python - OpenCV 的 label2rgb 实现

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:14 30 4
gpt4 key购买 nike

OpenCV 是否具有可以可视化标签的 Mat 的功能?即,类似于 o matlabs label2rgb()

我能找到的最接近的是:cv2.applyColorMap(cv2.equalizeHist(segments), cv2.COLORMAP_JET)

但是,当对标签数量从一帧到下一帧发生变化的视频进行分割时,这不是理想的方法。原因是;一帧将有 2 个标签(0 和 1 - 代表天空和地面),因此使用 jet 可能会将这两个部分分别显示为深蓝色和红色。下一帧有 3 个标签(0、1、2 - 天空、地面和汽车),因此地面部分现在颜色从红色变为黄色。因此,当您将其可视化时,相同的部分会不断改变颜色,而不是保持一致的颜色(红色)。

因此,像 matlabs label2rbg() 这样的函数如果存在的话会非常有用吗?

最佳答案

当标签少于 256 个时,我喜欢使用 cv2.LUT(因为它只适用于 uint8)。如果您有超过 256 个标签,您始终可以使用 (labels % 256).astype(np.uint8) 转换为 256 个值。

然后使用您的标签,您只需调用:rgb = cv2.LUT(labels, lut)

唯一剩下的问题是为您的标签创建一个查找表 (lut)。您可以按如下方式使用 matplotlib 颜色图:

import numpy as np
import matplotlib.pyplot as plt
import cv2

def label2rgb(labels):
"""
Convert a labels image to an rgb image using a matplotlib colormap
"""
label_range = np.linspace(0, 1, 256)
lut = np.uint8(plt.cm.viridis(label_range)[:,2::-1]*256).reshape(256, 1, 3) # replace viridis with a matplotlib colormap of your choice
return cv2.LUT(cv2.merge((labels, labels, labels)), lut)

在许多情况下,最好让相邻标签的颜色大不相同。 Rick Szelski 在他的 book 中给出了实现此目的的伪代码。 , 附录 C2:伪彩色生成。我过去曾使用过他的算法及其变体,编写代码非常简单。这是使用他的算法的示例代码:

import numpy as np
import cv2


def gen_lut():
"""
Generate a label colormap compatible with opencv lookup table, based on
Rick Szelski algorithm in `Computer Vision: Algorithms and Applications`,
appendix C2 `Pseudocolor Generation`.
:Returns:
color_lut : opencv compatible color lookup table
"""
tobits = lambda x, o: np.array(list(np.binary_repr(x, 24)[o::-3]), np.uint8)
arr = np.arange(256)
r = np.concatenate([np.packbits(tobits(x, -3)) for x in arr])
g = np.concatenate([np.packbits(tobits(x, -2)) for x in arr])
b = np.concatenate([np.packbits(tobits(x, -1)) for x in arr])
return np.concatenate([[[b]], [[g]], [[r]]]).T

def labels2rgb(labels, lut):
"""
Convert a label image to an rgb image using a lookup table
:Parameters:
labels : an image of type np.uint8 2D array
lut : a lookup table of shape (256, 3) and type np.uint8
:Returns:
colorized_labels : a colorized label image
"""
return cv2.LUT(cv2.merge((labels, labels, labels)), lut)

if __name__ == '__main__':
labels = np.arange(256).astype(np.uint8)[np.newaxis, :]
lut = gen_lut()
rgb = labels2rgb(labels, lut)

这是颜色图:

enter image description here

关于python - OpenCV 的 label2rgb 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57068382/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com