java从红外图片提取温度,计算超过阈值的温度占总面积的百分比

灰度图是单通道图,像素只有一个值:灰度值。灰度值越高,则图像越亮。

现在我们已经知道我们看到一张灰度图是由许多不同灰度值的像素点构成,而每个像素就是一个越亮的像素,灰度值越高,最高值是255(白色),越暗的像素,灰度值越低,最低值是0(黑色)。灰度值在0~255之间的像素呈现不同程度的灰色。这样,通过不同的灰度层次,图像也就展现出来了。

        我们已经知道我们看到一张灰度图是由许多不同灰度值的像素点构成,而每个像素就是一个代表灰度值的数字,那么我们想想许多数字按照图像的形状成矩形排列,会变成什么呢?没错,学过线性代数的小伙伴一下子就猜出来了,就是——矩阵。

首先在pom中引入opencv的依赖

<dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.5.1-1</version>
</dependency>
<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>5.3.0</version>
</dependency><!-- 以下以opencv为例,添加你需要的库的相关依赖 -->
<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.7</version>
</dependency>

灰度值的范围为0-255,根据灰度值的范围和红外图的右侧温度调范围21.5-124 建立线性关系

public static float map(int value, int min1, int max1, float min2, float max2) {return (float) (min2 + (value - min1) * (max2 - min2) / (max1 - min1));
}
public static double getTempture(int pixe) {double mappedValue=0.0;for (int i = 0; i <= 248; i++) {if (i==pixe){mappedValue = map(i, 0, 248, 21.5f, 124f);}}return mappedValue;
}

计算面积的完整代码如下:

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import static org.opencv.highgui.HighGui.imshow;
import static org.opencv.imgcodecs.Imgcodecs.imread;public class InfraredTemperature {static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static float map(int value, int min1, int max1, float min2, float max2) {return (float) (min2 + (value - min1) * (max2 - min2) / (max1 - min1));}public static double getTempture(int pixe) {double mappedValue=0.0;for (int i = 0; i <= 248; i++) {if (i==pixe){mappedValue = map(i, 0, 248, 21.5f, 124f);}}return mappedValue;}public static void main(String[] args) {// 读取图像  IMREAD_GRAYSCALEMat img = Imgcodecs.imread("C:\\Users\\lenovo\\Desktop\\999.jpg", Imgcodecs.IMREAD_GRAYSCALE );// 阈值double thresholdValue = 110;// 创建一个全黑的同样大小的图片,用于存储结果Mat result = Mat.zeros(img.size(), CvType.CV_8UC1);// 计算超过阈值的面积double totalArea = img.size().height * img.size().width;double thresholdedArea = 0;double  surplusArea =0;List<Integer> listOfDoubles = new ArrayList<>();// 遍历图像中的每个像素for (int y = 0; y < img.size().height; y++) {for (int x = 0; x < img.size().width; x++) {int pixelValue =(int) Math.round(img.get(y, x)[0]) ;listOfDoubles.add(pixelValue);}}//灰度值的最大值System.out.println("count is  " + Collections.max(listOfDoubles));for (int y = 0; y < img.size().height; y++) {for (int x = 0; x < img.size().width; x++) {//该值为实际温度和最大像素值相除得来的double pixelValue = img.get(y, x)[0];double pixelValueInfo =getTempture((int) Math.round(pixelValue));if (pixelValueInfo > thresholdValue) {result.put(y, x, 248); // 将超过阈值的点设置为白色thresholdedArea++;}else {surplusArea++;}}}// 计算超过阈值的面积所占的百分比double areaFraction = thresholdedArea / totalArea;// 输出结果int countInfo=0;for (int i = 0; i < listOfDoubles.size(); i++) {if (listOfDoubles.get(i)==248){countInfo++;}}//最大灰度值出现的次数System.out.println("countInfo is " + countInfo);//超过阈值的面积System.out.println("thresholdedArea is " + thresholdedArea);//低于阈值的面积System.out.println("surplusArea is " + surplusArea);System.out.println("totalArea is " + totalArea);System.out.println("Area of pixels with temperature over " + thresholdValue + "°C: " + areaFraction);// 如果需要可视化结果,可以显示result图片Imgcodecs.imwrite("C:\\Users\\lenovo\\Desktop\\888.jpg", result);// 释放资源img.release();result.release();}}

其中还有获取红外图右侧温度条的逻辑

即用java调用ocr库实现红外图上文本的获取,代码如下

<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>5.3.0</version>
</dependency>
import com.spire.ocr.OcrScanner;
import org.apache.commons.io.FileUtils;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;public class InfraredTemperatureExtractor {public static void main(String[] args) throws Exception {BufferedImage image = ImageIO.read(new File("D:\\13.jpg"));// 获取图片的宽度和高度int width = image.getWidth();int height = image.getHeight();//         创建一个新的图片,保留原来的类型和颜色空间
//        *     x: 裁剪起点横坐标
//                *     y: 裁剪起点纵坐标
//                *     w: 需要裁剪的宽度
//                *     h: 需要裁剪的高度BufferedImage croppedImage = image.getSubimage(width / 2, 0, width / 2, height);try {// 写入新图片ImageIO.write(croppedImage, "jpg", new File("D:\\13_1.jpg"));//指定依赖文件的路径String dependencies = System.getProperty("user.dir") + "\\dependencies";//指定要需要扫描的图片的路径String imageFile = "D:\\13_1.jpg";
//            RandomAccessFile raf = new RandomAccessFile(imageFile, "rw");//创建OcrScanner对象,并设置其依赖文件路径OcrScanner scanner = new OcrScanner();scanner.setDependencies(dependencies);//扫描指定的图像文件scanner.scan(imageFile);//获取扫描的文本内容String scannedText = scanner.getText().toString();List<Double> numbers = new ArrayList<>();// 分割字符串// 将每行转换为整数并添加到列表中String[] lines = scannedText.split("\n");for (int i = 0; i < lines.length; i++) {if (i != lines.length - 1) {numbers.add(Double.parseDouble(lines[i]));}}System.out.println(numbers);} catch (Exception e) {e.printStackTrace();}File imageFileInfo = new File("D:\\13_1.jpg");try {boolean fileDeletable = imageFileInfo.canWrite();System.out.println("文件是否可以删除" +fileDeletable);//回收System.gc();imageFileInfo.delete();
//            FileUtils.forceDelete(imageFileInfo);} catch (Exception e) {e.printStackTrace();}}//    public static void delete(File imageFileInfo) {
//        boolean s=false;
//        try {
//            System.gc();
//              FileUtils.forceDelete(imageFileInfo);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//    }
}

//指定依赖文件的路径 String dependencies = System.getProperty("user.dir") + "\\dependencies";

安装包可以自行下载,和项目放在指定目录下即可

还有一个坑 OcrScanner scanner = new OcrScanner();没有关闭流的操作,在删除剪裁好的文件时可能出现无法删除的现象,这个时候可以用System.gc();回收程序对图片的占用,从而达到删除剪裁好的图片的效果。

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

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

相关文章

Latex的参考文献中显示三个问号???——解决办法

1、问题描述 在使用spring模板&#xff0c;并引用book时&#xff0c;末尾的引文地方出现三个???由于使用的bibtex是直接从谷歌学术中导出来的&#xff0c;其中仅包含作者&#xff0c;书名&#xff0c;出版社&#xff0c;年份等&#xff0c;缺少了重要的信息。结果导致在出版…

什么!没有Starter的阿里云OSS也能集成到SpringBoot?

实际上&#xff0c;我们在Maven存储库中尝试搜索阿里云OSS。在此过程中&#xff0c;我们会发现阿里云官方未提供一种集成Spring Boot的模式&#xff0c;即xxx-Springboot-Starter&#xff0c;显然&#xff0c;这是一个需要自行定制的组件。然而&#xff0c;如今许多企业在研发过…

LeetCode | 520.检测大写字母

这道题直接分3种情况讨论&#xff1a;1、全部都为大写&#xff1b;2、全部都为小写&#xff1b;3、首字母大写其余小写。这里我借用了一个全是大写字母的串和一个全为小写字母的串进行比较 class Solution(object):def detectCapitalUse(self, word):""":type …

【机器学习】计算机图形和深度学习模型NeRF详解(1)

1.引言 1.1.1. NeRF研究的背景 人们在拍照的时候&#xff0c;往往会中各个角度进行拍摄&#xff0c;以呈现出物体的全貌和美丽。下图的照片&#xff0c;拍摄的是一架楼梯&#xff0c;但是拍摄的角度完全不同&#xff1a; 我们可以看到这些图片都是楼梯的照片&#xff0c;但拍…

Training language models to follow instructions with human feedback 论文阅读

论文原文&#xff1a;https://arxiv.org/pdf/2203.02155 论文简介 语言模型越大并不意味着它能更好的理解用户的意图&#xff0c;因此在这篇论文中&#xff0c;展示了根据人的反馈对模型进行微调&#xff0c;使得语言模型能够在各种人物上更好的理解用户的意图。在评估中&…

树莓派4B学习笔记11:PC端网线SSH连接树莓派

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习使用网线连接树莓派&#xff0c;网线可以提供更…

使用 C# 学习面向对象编程:第 8 部分

抽象方法 亲爱的读者&#xff0c;本文是 OOP 的第四大支柱&#xff0c;也是最后一大支柱。对于 OOP 初学者来说&#xff0c;这很容易让人困惑。因此&#xff0c;我们用非常简单的语言提供了一个示例。 “抽象用于管理复杂性。无法创建抽象类的对象。抽象类用于继承。” 例如…

降噪领夹麦克风哪个牌子好?揭秘无线领夹麦克风哪个降噪好

相信很多新手视频创作者都有一个疑问&#xff1a;为什么别人的视频或者直播音质这么清晰&#xff0c;几乎没什么噪音呢&#xff1f;其实最主要的就是麦克风的原因&#xff0c;相机或手机内置的麦克风是无法提供高质量的音频记录以及很好的指向性的。 想要拍摄出来的视频作品拥有…

每一个男人都曾有一个机器人的梦想

每一个男人都曾有一个机器人的梦想 我也有 每一个男人都曾有一个机器人的梦想。对于我来说&#xff0c;这个梦想始于童年时代&#xff0c;那时变形金刚风靡一时&#xff0c;几乎所有80后的孩子都为之疯狂。我是80后中的一员&#xff0c;那时候的科技还远没有如今这般发达&#…

《现代通信原理与技术》码间串扰和​​​​​​​无码间串扰的眼图对比实验报告

实 验&#xff1a;码间串扰和无码间串扰的眼图对比实验报告 摘 要&#xff1a; 在数字通信系统中&#xff0c;码间串扰&#xff08;Inter-Symbol Interference, ISI&#xff09;是影响信号质量和系统性能的重要因素之一。本实验通过MATLAB软件生成并对比了受码间串扰影响和未…

华为昇腾异构计算架构CANN及AI芯片简介

异构计算架构CANN 异构计算架构CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是华为针对AI场景推出的异构计算架构&#xff0c;向上支持多种AI框架&#xff0c;包括MindSpore、PyTorch、TensorFlow等&#xff0c;向下服务AI处理器与编程&#xff0c;…

Open To Buy(OTB)计划:零售业者的库存管理利器

在当今快速变化的服装市场中&#xff0c;如何高效、精准地进行商品管理成为了服装企业竞争的关键。OTB&#xff08;Open-to-Buy&#xff09;作为一种有效的商品管理方法&#xff0c;在企业管理中扮演着至关重要的角色。它基于预算、商品计划以及市场需求等多维度因素&#xff0…

Android开发系列(二)Jetpack Compose 之Text控件

Jetpack Compose是一种全新的声明式UI框架&#xff0c;用于构建Android应用程序。Jetpack Compose Text控件是Compose中用于显示文本的基本UI组件。 Text是一个可组合函数&#xff0c;函数声明如下所示。 Composable fun Text(text: String,modifier: Modifier Modifier,colo…

AGI 远不止 ChatGPT!一文入门 AGI 通识及应用开发

AI 大语言模型进入爆发阶段 2022 年 12 月 ChatGPT 突然爆火&#xff0c;原因是其表现出来的智能化已经远远突破了我们的常规认知。虽然其呈现在使用者面前仅仅只是一个简单的对话问答形式&#xff0c;但是它的内容化水平非常强大&#xff0c;甚至在某些方面已经超过人类了&am…

k8s上使用ConfigMap 和 Secret

使用ConfigMap 和 Secret 实验目标&#xff1a; 学习如何使用 ConfigMap 和 Secret 来管理应用的配置。 实验步骤&#xff1a; 创建一个 ConfigMap 存储应用配置。创建一个 Secret 存储敏感信息&#xff08;如数据库密码&#xff09;。在 Pod 中挂载 ConfigMap 和 Secret&am…

计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换

图像变换&#xff1a;点运算、灰度变换、直方图变换 1.点运算(1)What(2)Why 2.灰度变换(1)What(2)Why(作用)(3)Which(有哪些灰度变换&#xff09; 3.直方图修正(1)直方图均衡化 1.点运算 (1)What 通过点运算&#xff0c;输出图像的每个像素的灰度值仅仅取决于输入图像中相对应…

【招联消费金融股份】有限公司2024年5月18日【算法开发岗暑期实习】一面试经验分享

招联消费金融股份有限公司2024年5月18日面试经验分享 面试流程&#xff1a;共30多分钟&#xff0c;先3分钟自我介绍&#xff0c;然后细细介绍简历上面的论文和实习信息。问题1&#xff1a;扩散模型的noise schedule有什么研究。问题2&#xff1a;有哪些常见的数学分布问题3&…

新版嘎嘎快充互联互通系统配置文档

宝塔环境配置 登录宝塔账号&#xff0c;安装nginx、mysql5.7、php7.2、supervisor、redisphp安装扩展&#xff1a; 1&#xff09;安装swooleloader72 将嘎嘎官方提供的swoole_loader_72_nts.so文件上传到 /www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718…

Spring的事务步骤

一、事务处理方案&#xff1a; Spring框架中提供的事务处理方案&#xff1a;一共有两种&#xff1a; 1.适合中小项目使用的&#xff0c; 注解方案&#xff1a; 注解的方式做事务用起来简单&#xff0c;灵活&#xff0c;方便&#xff0c;中小型项目中用它比较方便&#xff0c…

基于STM32和人工智能的智能水质监测系统

目录 引言环境准备智能水质监测系统基础代码实现&#xff1a;实现智能水质监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能水质管理与优化问题解决方案与优化收尾与总结 1. 引言 随着环境保护意识的提高&#xf…