前端Excel热成像数据展示及插值算法

在这里插入图片描述

🎬 江城开朗的豌豆:个人主页

 🔥 个人专栏:《 VUE 》 《 javaScript 》

 📝 个人网站 :《 江城开朗的豌豆🫛 》 

⛺️生活的理想,就是为了理想的生活!

目录

📘 前言

📘一、热成像数据的导入与展示

📟 1.数据导入:

📟 2.创建热图:

📟3.数据可视化

📘二、插值算法的应用

📟 1.线性插值:

📟 2.双线性插值:

 📟 3.样条插值:

📘三、实例操作

📘 完整代码展示

📘 写在最后


📘 前言

热成像技术在工业、医学和科学研究中发挥了重要作用,它能够通过捕捉不同物体的温度分布图像来提供宝贵的信息。然而,要有效地展示和分析这些热成像数据,我们需要使用适当的工具和算法。本文将介绍如何使用Excel展示热成像数据,并实现插值算法以增强数据分析的准确性和可视化效果。

 原始图

 转换成功的效果图

📘一、热成像数据的导入与展示

热成像设备通常生成的是包含温度信息的二维数组数据。在Excel中展示这些数据,可以通过以下步骤

📟 1.数据导入

 将热成像数据以CSV或XLSX格式导入Excel。通常,这些数据以矩阵的形式存储,每个单元格代表一个温度值。

📟 2.创建热图

在Excel中,可以使用条件格式来创建热图。选择包含温度数据的单元格区域,应用“条件格式”中的“色阶”功能,以不同的颜色表示不同的温度范围。这种可视化方法能帮助快速识别热图中的热点区域。

📟3.数据可视化

  利用Excel的图表工具,将数据以图表形式展示。例如,可以创建散点图或折线图,帮助分析温度随时间或位置的变化

📘二、插值算法的应用

在热成像数据中,可能存在一些缺失值或数据点稀疏的情况。插值算法可以帮助我们估算这些缺失值,并提高数据的连续性。以下是一些常见的插值算法及其在Excel中的实现方法:

📟 1.线性插值

线性插值是最简单的插值方法,通过连接已知数据点的直线来估算未知点的值。在Excel中,可以通过线性回归或在两个已知数据点之间插入一个新的数据点来实现。

📟 2.双线性插值

双线性插值适用于二维数据,使用已知点形成的矩阵进行插值。你可以在Excel中创建一个新的数据表,通过公式计算每个数据点的插值值。双线性插值公式如下:

 📟 3.样条插值

样条插值是一种更复杂的插值方法,通过多项式拟合数据点,实现平滑的曲线插值。在Excel中,这种方法可以通过插件或VBA代码实现,虽然设置相对复杂,但可以生成更平滑的数据图。

📘三、实例操作

假设我们有一个包含热成像数据的Excel表格,我们可以通过以下步骤进行插值和数据展示:

  1. 创建数据表: 将热成像数据输入Excel,并使用条件格式创建热图。

  2. 应用插值算法: 使用Excel的插值公式填补缺失数据,或通过VBA实现更复杂的插值算法。

  3. 数据分析与优化: 根据插值后的数据,生成更精确的热图和图表。利用Excel的数据分析工具,评估数据的准确性和可靠性。

📘 完整代码展示

        

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Excel Heatmap with Canvas</title><script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script><style>#heatmapCanvas {/* border: 1px solid black; */}</style></head><body><button onclick="chuNenFx()">储能分析</button><input type="file" id="fileInput" /><input type="number" id="reLiNum" placeholder="输入数字" /><button onclick="getValue()">获取值</button>  <button onclick="showMaxTemperature()">显示最高温度</button><button onclick="showMinTemperature()">显示最低温度</button><br /><button onclick="highlightMaxTemperature()">标记最高温度</button><button onclick="highlightMinTemperature()">标记最低温度</button><canvas id="heatmapCanvas"></canvas><script>document.getElementById("fileInput").addEventListener("change", handleFileSelect, false);// 双线性插值算法var newData = [];function processFile() {const fileInput = document.getElementById("fileInput");const file = fileInput.files[0];const reader = new FileReader();reader.onload = function (event) {const data = new Uint8Array(event.target.result);const workbook = XLSX.read(data, { type: "array" });const sheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[sheetName];const csv = XLSX.utils.sheet_to_csv(worksheet);const arrayData = csvToArray(csv);const interpolatedData = interpolate22(arrayData, 480, 640); // 增加到 240, 320 的分辨率   1440, 1920 --  384, 512//   console.log("Interpolated", interpolatedData);const szNew = interpolatedData.map((row) => row.map((cell) => Math.round(cell))).map((row) => row.filter((cell) => cell !== 0) // 过滤掉值为 0 的元素);console.log(szNew);newData = szNew;};reader.readAsArrayBuffer(file);}function interpolate22(data, newRows, newCols) {const rows = data.length;const cols = data[0].length;const interpolatedData = Array.from({ length: newRows }, () =>Array(newCols).fill(0));for (let i = 0; i < newRows; i++) {for (let j = 0; j < newCols; j++) {const xRatio = (j / (newCols - 1)) * (cols - 1);const yRatio = (i / (newRows - 1)) * (rows - 1);const x0 = Math.floor(xRatio);const x1 = Math.min(x0 + 1, cols - 1);const y0 = Math.floor(yRatio);const y1 = Math.min(y0 + 1, rows - 1);const q11 = data[y0][x0];const q21 = data[y0][x1];const q12 = data[y1][x0];const q22 = data[y1][x1];const r1 = (x1 - xRatio) * q11 + (xRatio - x0) * q21;const r2 = (x1 - xRatio) * q12 + (xRatio - x0) * q22;interpolatedData[i][j] = (y1 - yRatio) * r1 + (yRatio - y0) * r2;}}return interpolatedData;}// 最大值function getMaxTemperature(data) {let maxTemp = -Infinity;for (const row of data) {for (const temp of row) {if (temp > maxTemp) {maxTemp = temp;}}}return maxTemp;}//   插值算法封装function interpolate(data, newRows, newCols) {const rows = data.length;const cols = data[0].length;const x = Array.from({ length: cols }, (_, i) => i);const y = Array.from({ length: rows }, (_, i) => i);const interpolatedData = Array.from({ length: newRows }, (_, i) => {return Array.from({ length: newCols }, (_, j) => {const xRatio = (j / (newCols - 1)) * (cols - 1);const yRatio = (i / (newRows - 1)) * (rows - 1);const x0 = Math.floor(xRatio);const x1 = Math.min(x0 + 1, cols - 1);const y0 = Math.floor(yRatio);const y1 = Math.min(y0 + 1, rows - 1);const q11 = data[y0][x0];const q21 = data[y0][x1];const q12 = data[y1][x0];const q22 = data[y1][x1];const r1 = (x1 - xRatio) * q11 + (xRatio - x0) * q21;const r2 = (x1 - xRatio) * q12 + (xRatio - x0) * q22;return (y1 - yRatio) * r1 + (yRatio - y0) * r2;});});return interpolatedData;}function csvToArray(text) {return text.split("\n").map((row) => row.split(",").map(Number));}var maxTemperature = [];// 最小值function getMinTemperature(data) {let minTemp = Infinity;for (const row of data) {for (const temp of row) {if (temp < minTemp) {minTemp = temp;}}}return minTemp;}// 显示最低温度function showMinTemperature() {const minTemperature = getMinTemperature(maxTemperature);alert(`最低温度是: ${minTemperature / 100}°C`);}function showMaxTemperature() {if (maxTemperature.length > 0) {const maxTempe = getMaxTemperature(maxTemperature);alert(`最高温度是: ${maxTempe / 100}°C`);} else {alert(`最高温度是: 请先上传数据`);}}// 封装双线性插值算法function bilinearInterpolate(x, y, values) {const x1 = Math.floor(x);const y1 = Math.floor(y);const x2 = Math.ceil(x);const y2 = Math.ceil(y);const Q11 = values[y1] ? values[y1][x1] : 0;const Q12 = values[y1] ? values[y1][x2] : 0;const Q21 = values[y2] ? values[y2][x1] : 0;const Q22 = values[y2] ? values[y2][x2] : 0;const xFraction = x - x1;const yFraction = y - y1;const R1 = Q11 * (1 - xFraction) + Q12 * xFraction;const R2 = Q21 * (1 - xFraction) + Q22 * xFraction;return R1 * (1 - yFraction) + R2 * yFraction;}// 获取excel数据async function handleFileSelect(event, json) {await processFile();const file = event.target.files[0];// console.log("=====>>>", file);if (!file) return;const reader = new FileReader();reader.onload = function (e) {const data = new Uint8Array(e.target.result);const workbook = XLSX.read(data, { type: "array" });// Assuming you want to process the first sheetconst sheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[sheetName];//   const json = XLSX.utils.sheet_to_json(worksheet, {//     header: 1,//     defval: 0,//   });// Default values for empty cells// Convert data to 2D array//   console.log("===========json=====================", json);const dataArray = newData.map((row) =>row.map((cell) => parseFloat(cell) || 0));//   console.log("Data Array:", dataArray);maxTemperature = dataArray;//   console.log("=workbook===" + maxTemperature);drawHeatmap(dataArray);};reader.readAsArrayBuffer(file);}// 插值算法const canvas = document.getElementById("heatmapCanvas");//   const cellSize = 10; // 原始单元格大小let newCellSize = 1; // 插值后的单元格大小function getValue() {const inputElement = document.getElementById("reLiNum");const value = inputElement.value; // 获取输入的值newCellSize = value;drawHeatmap(maxTemperature); // 重新绘制热力图}//   页面跳转function chuNenFx() {window.location.replace("./boxEchars.html");}//   绘制热力图function drawHeatmap(dataArray) {const width = dataArray[0].length;const height = dataArray.length;// 计算新画布的宽度和高度const canvasWidth = width * newCellSize;const canvasHeight = height * newCellSize;// Adjust canvas sizecanvas.width = canvasWidth; // Scale widthcanvas.height = canvasHeight; // Scale heightconst ctx = canvas.getContext("2d");const imageData = ctx.createImageData(canvasWidth, canvasHeight);// 查找归一化的最小值和最大值let min = Infinity;let max = -Infinity;dataArray.flat().forEach((value) => {if (value < min) min = value;if (value > max) max = value;});// 生成热力图for (let y = 0; y < canvasHeight; y++) {for (let x = 0; x < canvasWidth; x++) {const dataX = x / newCellSize;const dataY = y / newCellSize;const value = bilinearInterpolate(dataX, dataY, dataArray);// const value = dataArray[y][x];const normalizedValue = (value - min) / (max - min);// for (let dy = 0; dy < cellSize; dy++) {//     for (let dx = 0; dx < cellSize; dx++) {//         const index = ((y * cellSize + dy) * canvas.width + (x * cellSize + dx)) * 4;//         const color = getHeatmapColor(normalizedValue);//         imageData.data[index] = color[0];//         imageData.data[index + 1] = color[1];//         imageData.data[index + 2] = color[2];//         imageData.data[index + 3] = 255;//     }// }// // 获取颜色值const color = getHeatmapColor(normalizedValue);// 设置画布上的像素颜色const index = (y * canvasWidth + x) * 4;imageData.data[index] = color[0]; // RedimageData.data[index + 1] = color[1]; // GreenimageData.data[index + 2] = color[2]; // BlueimageData.data[index + 3] = 255; // Alpha}}// console.log("imageDat", imageData);ctx.putImageData(imageData, 0, 0);}// 找到最高温度及其位置function getMaxTemperatureInfo(isMax) {let extremeTemp = isMax ? -Infinity : Infinity;let position = { row: 0, col: 0 };maxTemperature.forEach((row, rowIndex) => {row.forEach((temp, colIndex) => {if ((isMax && temp > extremeTemp) ||(!isMax && temp < extremeTemp)) {extremeTemp = temp;position = { row: rowIndex, col: colIndex };}});});return { extremeTemp, position };}// 找到最高温度及其位置//   function getMaxTemperatureInfo() {//     let maxTemp = -Infinity;//     let position = { row: 0, col: 0 };//     maxTemperature.forEach((row, rowIndex) => {//       row.forEach((temp, colIndex) => {//         if (temp > maxTemp) {//           maxTemp = temp;//           position = { row: rowIndex, col: colIndex };//         }//       });//     });//     return { maxTemp, position };//   }// 标记最高温度function highlightMaxTemperature() {const { extremeTemp, position } = getMaxTemperatureInfo(true);drawHeatmap(maxTemperature); // 重新绘制热力图const ctx = canvas.getContext("2d");// 绘制标记ctx.strokeStyle = "yellow";ctx.lineWidth = 30;ctx.beginPath();const x = position.col * newCellSize + newCellSize / 2;const y = position.row * newCellSize + newCellSize / 2;ctx.arc(x, y, newCellSize / 4, 0, 2 * Math.PI);ctx.stroke();ctx.fillStyle = "yellow";ctx.fill();// alert(`最高温度是: ${extremeTemp/100}°C`);// 显示温度值ctx.fillStyle = "black";ctx.font = "12px Arial";ctx.textAlign = "center";ctx.textBaseline = "middle";ctx.fillText(`${extremeTemp / 100}°C`, x, y);}// 标记最低温度function highlightMinTemperature() {const { extremeTemp, position } = getMaxTemperatureInfo(false);drawHeatmap(maxTemperature); // 重新绘制热力图const ctx = canvas.getContext("2d");// 绘制标记ctx.strokeStyle = "green";ctx.lineWidth = 30;ctx.beginPath();const x = position.col * newCellSize + newCellSize / 2;const y = position.row * newCellSize + newCellSize / 2;ctx.arc(x, y, newCellSize / 4, 0, 2 * Math.PI);ctx.stroke();ctx.fillStyle = "green";ctx.fill();// alert(`最低温度是: ${extremeTemp/100}°C`);// 显示温度值ctx.fillStyle = "white";ctx.font = "12px Arial";ctx.textAlign = "center";ctx.textBaseline = "middle";ctx.fillText(`${extremeTemp / 100}°C`, x, y);}function getHeatmapColor(value) {// 从蓝色到红色的简单热图颜色渐变const r = Math.min(255, Math.max(0, Math.floor(255 * value)));const g = Math.min(255, Math.max(0, Math.floor(255 * (1 - value))));const b = 0;return [r, g, b];}</script></body>
</html>


📘 写在最后

Excel作为一种强大的数据处理工具,可以有效地展示和分析热成像数据。通过合理使用插值算法,可以提升数据的连续性和可视化效果。希望本文能帮助你更好地利用Excel进行热成像数据的展示和分析。如果你有更复杂的数据需求,也可以考虑结合使用专业的数据分析工具和编程语言。

通过掌握这些基本技巧,你将能够更好地理解和利用热成像数据,为你的工作和研究提供有力支持。

感谢大家一如既往对我的点赞与支持,不是我的作品有多好,而是你们的不嫌弃。这世界上有一种爱叫“关注”,感恩遇见、感恩有你~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421757.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux s3c2440 开发板上的操作系统实现 ubuntu

使用s3c2440开发板 使用ubuntu 1.ubuntu中的tftp&#xff0c;和nfs Trivial File Transfer Protocol,简单文件 传输协议。 通过网络在客户端与服务器之间进行简单文件 传输。提供不复杂、开销不大的文件传输服务。 Network File System&#xff0c;网络文件系统。通过 网络…

如何显示Dialog窗口

文章目录 1. 概念介绍2. 使用方法2.1 Overlay效果2.1 Dialog效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示snackBar"相关的内容&#xff0c;本章回中将介绍使用get显示Dialog.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

深入剖析嵌套调用和链式访问,以及函数的声明和定义(超全面覆盖)

1. 前情提要 在上一篇博客中&#xff0c;我们大致了解了函数的种类&#xff0c;以及自定义函数中形参和实参的具体区别 我们知道实参是需要传递给形参的&#xff0c;但其实形参和实参占据的是完全独立的内存空间 x&#xff0c;y在执行过程中会得到a和b的值&#xff0c;但是x…

Redis的数据类型以及应用场景

Redis - 数据类型 Redis是一种开源的内存数据结构存储&#xff0c;用作数据库、缓存和消息代理。 它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。 1. 字符串&#xff08;String&#xff09; Redis 的字符串&#xff08;String&#xff09;数据类型…

SQL(结构性查询语句)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、SQL是什么&#xff1f;二、DDL三、DML四、DQL五、DCL总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、SQL是什么&#xff…

Linux之Shell编程规范与变量

Shell编程规范与变量 本章结构 Shel脚本概述 Shell的作用Shel编程规范重定向与管道 Shell脚本变量 自定义变量特殊变量 Shel脚本概述 Shel脚本的概念 将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作 Shel脚本应…

二叉树(中)

目录 二叉树的基本操作 设置基本变量 获取树中结点的个数 获取叶子结点个数 获取第K层结点的个数 获取二叉树高度 检测值为value的元素是否存在 二叉树的基本操作 如果需要了解树和二叉树的基本内容&#xff0c;可以转至&#xff1a;二叉树&#xff08;上&#xff09;-CSDN…

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 大语言模型已被广泛采用&#xff0c;但推理时需要大量的GPU内…

CentOS7 使用yum报错:[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。

CentOS7 使用yum报错&#xff1a;[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。 CentOS镜像下载、VM虚拟机下载 下载地址&#xff1a;www.macfxb.cn 一、问题描述 安装完CentOS7 后 使用yum报错 如下图 二、解决方案 1.查看自己的系统架构 我的是aarch64 uname …

CCPC赛后补题-线性基

模板题&#xff1a;https://www.luogu.com.cn/problem/P3812 线性基可以用一个长度为$ \log_2N $的数组描述值域[1,N]&#xff0c;0的情况需要特判。 一个长度为64的线性基可以描述所有的64位整数。 在2024年CCPC网络赛中&#xff0c;考到了线性基。没学过&#xff0c;追悔莫…

Vulnhub靶场 DC-2

靶机地址:https://www.vulnhub.com/entry/dc-2,311/ 导入到VMware里面去, 设置NAT模式 namp扫描一下c段获取ip地址, 然后再扫描ip地址获取详细的信息 得到ip 192.168.75.134 无法访问 按照下面这个方法可以访问了 在kali上的处理 flag1 网站上就存在 提示了一个cewl工具,…

特斯拉的底牌

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

对抗性EM用于变分深度学习:在低剂量PET和低剂量CT中的半监督图像质量增强应用|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 Adversarial EM for variational deep learning: Application to semi-supervised image quality enhancement in low-dose PET and low-dose CT 对抗性EM用于变分深度学习&#xff1a;在低剂量PET和低剂量CT中的半监督图像质量增强应用 01 文献速递介绍 医学影…

【MySQL】从0开始在Centos 7环境安装MySQL

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:MySQL ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 准备步骤 卸载原有环境 安装步骤 获取MySQL官方yum源 安装MySQL yum源 结语 准备步骤 卸载原有环境 第一步登录云服务器(注意安装yum需要在root身份下…

CC工具箱使用指南:【字段计算器学习版】

一、简介 这个工具算是Pro自带的字段计算器的扩展版。 工具预制了几种计算模式&#xff0c;通过可视化操作&#xff0c;帮你自动生成代码。 生成代码后&#xff0c;可以直接运行&#xff0c;也可以将代码复制到Pro自带的字段计算器中进行计算。 总之&#xff0c;这是给不会…

基于准静态自适应环型缓存器(QSARC)的taskBus万兆吞吐实现

文章目录 概要整体架构流程技术名词解释技术细节1. 数据结构2. 自适应计算队列大小3. 生产者拼接缓存4. 高效地通知消费者 小结1. 性能表现情况2. 主要改进和局限3. 源码和发行版 概要 准静态自适应环形缓存器&#xff08;Quasi-Static Adaptive Ring Cache&#xff09;是task…

【R语言】删除数据框中所有行中没有大于200的数值的行

在Perl中还需要循环按行读入文件&#xff0c;而在R中&#xff0c;一行代码解决问题&#xff1a; df <- df[apply(df, 1, function(x) any(x > 200)), ]这是一个使用apply函数对数据框df进行操作的表达式。apply函数用于对数据框、矩阵或数组进行元素级别的操作。 df&am…

LINQ 和 LINQ扩展方法 (1)

LINQ函数概念&#xff1a; LINQ&#xff08;Language Integrated Query&#xff09;是一种C#语言中的查询技术&#xff0c;它允许我们在代码中使用类似SQL的查询语句来操作各种数据源。这些数据源可以是集合、数组、数据库、XML文档等等。LINQ提供了一种统一的编程模型&#x…

C++ Qt开发:运用QJSON模块解析数据

转载C Qt开发&#xff1a;运用QJSON模块解析数据-阿里云开发者社区 Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&…

OpenHarmony鸿蒙( Beta5.0)智能门铃开发实践

鸿蒙开发往期必看&#xff1a; 一分钟了解”纯血版&#xff01;鸿蒙HarmonyOS Next应用开发&#xff01; “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…