繁体   English   中英

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

[英]How to convert a grayscale image to heatmap image with Python OpenCV

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

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

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

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

方法#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 有数百种不同的颜色图,并允许您创建自己的自定义颜色图,而 OpenCV 只有 12 个可供选择。 这是内置的 OpenCV 颜色图选择:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM