如何使用 Python OpenCV 将灰度图像转换为热图图像

har*_*ake 9 python opencv image-processing

我有一个(540, 960, 1)形状的图像,其值范围[0..255]为黑色和白色。我需要将其转换为“热图”表示。例如,像素255应该是最热的,像素应该是最0不热的。其他介于两者之间。我还需要将热图作为 Numpy 数组返回,以便稍后将它们合并到视频中。有没有办法实现这一目标?

nat*_*ncy 21

这里有两种方法,一种使用 Matplotlib,一种仅使用 OpenCV

方法#1: OpenCV +matplotlib.pyplot.get_cmap

为了实现灰度(1 通道)->热图(3 通道)转换,我们首先将图像作为灰度加载。默认情况下,OpenCV 以 3 通道、8 位 BGR 的形式读取图像。我们可以在图像中使用灰度直接加载cv2.imread()cv2.IMREAD_GRAYSCALE参数或使用cv2.cvtColor()转换一个BGR图像与灰度cv2.COLOR_BGR2GRAY参数。加载图像后,我们将这个灰度图像放入 Matplotlib 以获得我们的热图图像。Matplotlib 返回 RGB 格式,因此我们必须转换回 Numpy 格式并切换到 BGR 色彩空间以与 OpenCV 一起使用。这是一个使用科学红外相机图像作为inferno颜色图输入的示例。请参阅在 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()
Run Code Online (Sandbox Code Playgroud)

方法#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()
Run Code Online (Sandbox Code Playgroud)

注意:虽然 OpenCV 的内置实现简短快捷,但我建议使用方法 #1,因为有更大的颜色图选择。Matplotlib 有数百种不同的颜色图,并允许您创建自己的自定义颜色图,而 OpenCV 只有 12 个可供选择。这是内置的 OpenCV 颜色图选择: