如何使用OpenCV C++基于二维数组生成指定规则的热力图
问题解答
这个需求完全可以通过OpenCV实现,核心是使用OpenCV的伪色彩映射功能配合数值归一化操作即可完成。
实现核心逻辑
- 第一步:将你现有的二维数值数组转换为OpenCV的
Mat格式,若数组是浮点数类型或者数值范围不在0-255区间,需要先做归一化处理。 - 第二步:为了满足高数值对应深色、低数值对应浅色的要求,归一化时可以使用反转映射规则:把原数组的最小值映射到255(浅色),最大值映射到0(深色),也可以在普通归一化后对图像做反转操作达到同样效果。
- 第三步:调用
applyColorMap函数给单通道灰度矩阵施加伪色彩映射,生成最终热力图。
最简示例代码
#include <opencv2/opencv.hpp> using namespace cv; int main() { // 示例二维数值数组,可替换为你自己的业务数据 float data[3][3] = {{1.2, 3.5, 5.7}, {2.3, 6.8, 9.1}, {4.5, 7.2, 10.0}}; Mat src_mat(3, 3, CV_32FC1, data); // 反转归一化到0-255区间,直接满足高值对应深色、低值对应浅色的要求 Mat normalized_mat; normalize(src_mat, normalized_mat, 255, 0, NORM_MINMAX, CV_8UC1); // 应用伪色彩映射,可替换为其他预定义色表适配你的风格需求 Mat heatmap; applyColorMap(normalized_mat, heatmap, COLORMAP_JET); // 输出结果 imwrite("heatmap_output.png", heatmap); imshow("生成热力图", heatmap); waitKey(0); return 0; }
注意事项
- 如果你只需要灰度深浅表示的热力图,不需要彩色效果,做完归一化的
normalized_mat本身就符合要求,无需再做色图映射。 - OpenCV内置了十几种预定义伪色彩表,你可以替换代码中的
COLORMAP_JET为COLORMAP_HOT、COLORMAP_INFERNO等其他值,匹配你想要的色彩风格。 - 如果你的原始二维数组本身就是0-255区间的8位无符号整数,可以跳过归一化步骤,直接执行
255 - 原Mat的反转操作后再做色图映射即可。
内容的提问来源于stack exchange,提问作者Voyager
相关产品推荐
相关产品推荐

