这里有两种方法,一种使用 Matplotlib,一种只使用 OpenCV
方法#1: OpenCV + matplotlib.pyplot.get_cmap
为了实现灰度(1 通道)-> 热图(3 通道)转换,我们首先将图像加载为灰度。默认情况下,OpenCV 将图像读取为 3 通道、8 位 BGR。
我们可以使用cv2.imread()和cv2.IMREAD_GRAYSCALE参数直接将图像加载为灰度图像,或者使用cv2.cvtColor()通过cv2.COLOR_BGR2GRAY参数将BGR图像转换为灰度图像。一旦我们加载图像,我们将这个灰度图像放入 Matplotlib 以获得我们的热图图像。 Matplotlib 返回 RGB 格式,因此我们必须转换回 Numpy 格式并切换到 BGR 颜色空间以与 OpenCV 一起使用。这是一个使用科学红外相机图像作为输入的示例,带有inferno 颜色图。请参阅choosing color maps in Matplotlib 了解可用的内置颜色图,具体取决于您所需的用例。
输入图片:
输出热图图片:
代码
import matplotlib.pyplot as plt
import numpy as np
import cv2
image = cv2.imread('frame.png', 0)
colormap = plt.get_cmap('inferno')
heatmap = (colormap(image) * 2**16).astype(np.uint16)[:,:,:3]
heatmap = cv2.cvtColor(heatmap, cv2.COLOR_RGB2BGR)
cv2.imshow('image', image)
cv2.imshow('heatmap', heatmap)
cv2.waitKey()
方法#2: cv2.applyColorMap()
我们可以使用 OpenCV 内置的热图功能。这是使用cv2.COLORMAP_HOT 热图的结果
代码
import cv2
image = cv2.imread('frame.png', 0)
heatmap = cv2.applyColorMap(image, cv2.COLORMAP_HOT)
cv2.imshow('heatmap', heatmap)
cv2.waitKey()
注意:虽然 OpenCV 的内置实现简短快捷,但我推荐使用方法 #1,因为有更大的颜色图选择。 Matplotlib 有 hundreds of various colormaps 并允许您使用 create your own custom color maps 而 OpenCV 只有 12 个可供选择。这是内置的 OpenCV 颜色图选择: