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

时间:2019-12-25 13:43:23

标签: python numpy opencv matplotlib image-processing

我有一个(540, 960, 1)形状的图像,其值的范围是黑白的[0..255]。我需要将其转换为“热图”表示形式。例如,255像素的热量最多,0像素的热量最少。其他之间。我还需要将热图作为Numpy数组返回,以便以后可以将它们合并到视频中。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

您需要将图像转换为适当的灰度表示。这可以通过几种方式完成,尤其是使用imread(filename, cv2.IMREAD_GRAYSCALE)。这样会将图像的形状缩小为(54,960)(提示,没有第三维)。

答案 1 :(得分:0)

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

方法1: OpenCV + matplotlib.pyplot.get_cmap

要实现灰度(1通道)->热图(3通道)转换,我们首先将图像加载为灰度。默认情况下,OpenCV读取图像为3通道8位BGR。 我们可以使用带有cv2.IMREAD_GRAYSCALE参数的cv2.imread()将图像直接加载为灰度图像,或者使用带有cv2.COLOR_BGR2GRAY参数的cv2.cvtColor()将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颜色图选择: