当前位置: 首页 > news >正文

前端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进行热成像数据的展示和分析。如果你有更复杂的数据需求,也可以考虑结合使用专业的数据分析工具和编程语言。

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ARM32开发——DMA
  • 011. Oracle-约束
  • 【设计模式】UML类图和六大设计原则
  • [基于 Vue CLI 5 + Vue 3 + Ant Design Vue 4 搭建项目] 08 创建项目的目录结构介绍
  • ggplot2 缩小的/一般长度的、带箭头的坐标轴 | R语言
  • django自用教程
  • 3个WebSocket的.Net开源项目
  • 赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
  • 【Mysql】记录sql在执行过程中很慢
  • 配电房数字式仪表读数识别算法开发
  • 开放式激光振镜运动控制器在Ubuntu+Qt下的文本标刻
  • Leetcode3271. 哈希分割字符串
  • Tranformer分布式特辑
  • 【C++】Stack
  • 【ShuQiHere】探索人工智能核心:机器学习的奥秘
  • 《Java编程思想》读书笔记-对象导论
  • 【React系列】如何构建React应用程序
  • Android Volley源码解析
  • CAP理论的例子讲解
  • GraphQL学习过程应该是这样的
  • Javascript设计模式学习之Observer(观察者)模式
  • PV统计优化设计
  • Python_OOP
  • Python连接Oracle
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 回顾 Swift 多平台移植进度 #2
  • 基于axios的vue插件,让http请求更简单
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端
  • 如何使用 JavaScript 解析 URL
  • 一起参Ember.js讨论、问答社区。
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​520就是要宠粉,你的心头书我买单
  • # Java NIO(一)FileChannel
  • # 职场生活之道:善于团结
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (2)STM32单片机上位机
  • (floyd+补集) poj 3275
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (算法)Game
  • (一)、python程序--模拟电脑鼠走迷宫
  • (转载)Linux 多线程条件变量同步
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net core + vue 搭建前后端分离的框架
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149