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

2024-05-15 00:47:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个(540, 960, 1)形状的图像,值从[0..255]不等,是黑白的。我需要把它转换成“热图”表示。例如,带有255的像素应该具有最大的热度,而带有0的像素的热度应该最小。其他介于两者之间。我还需要将热图作为Numpy数组返回,以便稍后将它们合并到视频中。有没有办法做到这一点?在


Tags: 图像numpy视频像素数组热图形状办法
2条回答

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

方法1:OpenCV+^{}

为了实现灰度(1通道)->热图(3通道)转换,我们首先将图像加载为灰度。默认情况下,OpenCV以3通道、8位BGR读取图像。 我们可以使用带cv2.IMREAD_GRAYSCALE参数的^{}直接将图像加载为灰度,或者使用^{}将BGR图像转换为带有cv2.COLOR_BGR2GRAY参数的灰度图像。加载图像后,我们将此灰度图像放入Matplotlib以获得热图图像。Matplotlib返回一个RGB格式,因此我们必须转换回Numpy格式并切换到BGR colorspace,以便与OpenCV一起使用。下面是一个使用科学的红外相机图像作为输入的例子。请参阅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()

方法二:^{}

我们可以使用OpenCV内置的热图函数。以下是使用cv2.COLORMAP_HOT热图得到的结果

代码

^{pr2}$

注意:虽然OpenCV的内置实现既短又快,但我建议使用方法1,因为有更大的colormap选择。Matplotlib有hundreds of various colormaps,允许您create your own custom color maps,而OpenCV只有12个可供选择。以下是内置的OpenCV颜色贴图选择:

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

相关问题 更多 >

    热门问题