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