红外热成像仪是把物体表面的红外辐射转换成可见图像的装置,其最终表达形式是红外热图[1]。因为一张热成像图片上只能直观显现温度的相对分布,无法具体获得温度的数据,因此要利用MATLAB进行后续的操作。一张热成像图为彩色图片,不同像素点的颜色代表着不同的温度,白色到黑色为高温到低温,即颜色越亮代表温度越高。热成像仪导出的图像格式为*.BMP,是一种位图,但在MATLAB将其转换为像素图易产生噪点,十分影响后续的温度提取,因此要先将BMP格式转换为JPG格式。
- 转换图片格式
以福禄克的Ti400型号得到的JPG图像为例,其分辨率为480×640,即在软件中得到的矩阵大小为480行,640列,矩阵数据格式为uint8,矩阵的元素值区间为[0,255]。处理后的图像为RGB格式,具有三个颜色通道。
- 提取图片像素信息转换为灰度图
一般认为,像素点的灰度值与一定范围的温度存在线性关系。因此,首先将彩色图像转成灰度图,转换的方法是将彩色图像中三个颜色通道的数值通过加权来计算。如下式所示
式中,ωi为不同颜色通道的权重,Mi为所提取的不同颜色通道的矩阵,r,g,b分别代表红、绿、蓝三个颜色通道。本文使用的权重大小为较经典的值:ωr=0.299,ωg=0.587,ωb=0.114。
(图片注释有误,实为伪彩色图片)
为了得到实际温度值和图像灰度值之间对应的线性关系,通过待定系数法确定参数值。先在热成像仪软件中读取温度值范围,取最大值Tmax和最小值Tmin,与灰度图像中的最大值Ymax和最小值Ymin分别对应,按照公式(2~3)计算可以确定T=kY+b的系数。
将得到的线性关系再用来计算灰度图上每一点的温度,即可完整提取出图片上的温度数据。
- 绘制3D温度云图
左图为3-D温度云图,能较好地显现出分析对象的温度分布。右图为MATLAB绘制的温度分布图,与热成像图对比,发现十分相似,证明了操作的准确性。
- 筛选温度(将环境与分析对象的温度区分开)
为了计算分析对象的均温,需要将对象上的温度筛选出来。虽然本文采用的分析对象是个比较规则的物体,可以通过截取图片的方法只保留需要的部分,但是该方法在面对数量较多的图片时就比较繁琐。采用温度判断法,判断的温度界限T1作为区分分析对象和环境的温度,可以显著地将分析对象从整张图片中分离,如图所示。将保留的温度部分数据进一步处理,就可以计算得到分析对象的均温。
当然,不同的温度界限筛选的效果不一,可以自己进行合理选择。将筛选后图片上所有温度相加除以次数即为平均温度。
-
-
附录相关MATLAB代码一份
clear;clc;close all; %读取一张图片,并显示 original_picture=imread('D:\Desktop\2.jpg'); figure(1); imshow(original_picture); impixelinfo; title('原始图像') r = original_picture(:,:,1); g = original_picture(:,:,2); b = original_picture(:,:,3); I = .299*r + .587*g + .114*b; % 转灰度图r figure(2) imshow(I) I_1=im2double(I); max_temp=max(max(I_1)); [x y]=find(I_1==max(max(I_1))); I_1(x,y); min_temp=im2double(min(min(I))); k = (24.1 - 13.5)/(max_temp - min_temp);% k = (28.9 - 28.73)/(t1 - t2); b = 24.1 - k*max_temp;% b = 28.9 - k*t1; % 得到灰度与温度的线性关系 k=im2double(k); b=im2double(b); temp=k*I_1+b; temp(x,y); figure(3) surf(temp) shading interp colorbar title('surf三维图'); figure(4) % surf3维图利用view调整视图 surf(temp) shading interp colorbar view([90, 90]); % 调整试图位置 title('surf + view'); i=0;j=0;k=0; temp_fil=zeros(480,640); for i=1:1:480 for j=1:1:640 if temp(i,j)<=18%18是给定的筛选用的界限温度,可以自己选择大小 temp_fil(i,j)=0; else temp_fil(i,j)=temp(i,j); k=k+1; end end end figure(5) surf(temp_fil) shading interp colorbar view([90, 90]); title('surf三维图'); %温度平均值 temp_averge=sum(temp_fil(:))/k;