胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化

胡乱捣鼓01——基于AMG8833热成像模块的显示优化
1.介绍一下AMG8833模块:松下品牌的AMG8833红外热像仪传感器是一个8*8的红外热传感器阵列,当连接到微控制器时,它将通过IIC返回一组64个单独的红外温度读数,紧凑而简单,便于集成。AMG8833提供比以前的AMG8831更高的性能,传感器仅支持IIC通讯,并且具有可配置的中断引脚,当任何单个像素高于或低于设置的阈值时,该引脚可以触发。
胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

【胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化】2.不足之处:该AMG8833红外热像仪传感器温度测量范围为0°C至80°C,精度为+ - 2.5°C。它可以从远达7米的距离检测物体。最大帧频为10Hz,非常适合创建人体探测器或迷你热像仪。
但是由于其返回的数据只有64个,所以直接利用这64个温度像素点来构建热成像的图像是极为不清晰的,这是AMG8833模块的最大的短板,也是实现热成像功能所要克服的至关重要的问题。下图是实测图与数据经MATLAB成像后的效果图。
胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

由上图可知,直接将模块传回的8 * 8个数据成像后,只能稍微看出一杯热水的轮廓,因而AMG8833模块的精度是远远不够的,为此必须对8 * 8的数据进行处理。显然,要使得成像效果图更加圆滑清晰,需要对其进行插值处理。
3.插值处理
插值的任务是由已知的观测点为物理量,建立一个简单、连续的解析模型,以便能根据该模型推测物理量在非观测点处的特性。插值包括多项式插值、艾尔米特插值、分段插值和样条插值等等,其中最常见的有双线性插值和双三次插值。这里选用常见的双线性插值以及双三次插值。
3.1 双线性插值
确定了插值方式后,将AMG8833的一组数据导入MATLAB作为一个新的矩阵b,其某时刻的数据采集图及导入的数据如图所示。
胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

因为回传的数据为8*8的一个网格数据,对于这种非函数关系的数据表,处理的方式会略有不同。先采用双线性插值的方法对数据进行插值处理。其原理较为简单,如下图所示,p点像素值决定于Q12、Q22、Q11、Q21这4个点的像素值。
胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

先在X轴方向做2次插值操作(分别为R1和R2),然后在Y轴方向做一次插值操作§,相反的,也可以先在Y轴做2次插值操作,然后在X轴做一次插值操作。具体公式如下:
胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,为取值[0,1)区间的浮点数。比如,现在假如目标图的象素坐标为(1,1),那么反推得到的对应于源图的坐标是(0.75 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(1,1)的取值不能够由这个虚拟象素来决定,而只能由源图的这四个象素共同决定:(0,0)(0,1)(1,0)(1,1),而由于(0.75,0.75)离(1,1)要更近一些,那么(1,1)所起的决定作用更大一些,这从公式1中的系数uv=0.75×0.75就可以体现出来,而(0.75,0.75)离(0,0)最远,所以(0,0)所起的决定作用就要小一些,系数(1-u)(1-v)=0.25×0.25也体现出了这一特点。
明白了具体的算法之后,在matlab中进行编程代码如下:

clear; clc; a = [27.50, 28.25, 29.75, 30.50, 28.50, 28.00, 28.25, 28.00 27.75, 27.25, 27.50, 29.00, 31.00, 29.25, 30.00, 29.25 26.50, 27.50, 26.75, 27.00, 30.75, 34.00, 46.50, 33.25 26.50, 26.75, 27.00, 27.00, 31.00, 39.00, 59.00, 40.75 26.00, 26.25, 25.75, 27.25, 29.50, 40.75, 59.50, 40.50 26.25, 25.50, 21.75, 23.75, 28.00, 41.00, 59.50, 37.50 26.50, 25.75, 17.50, 20.75, 28.00, 41.25, 53.25, 34.50 27.25, 25.75, 24.75, 25.00, 28.00, 33.75, 36.25, 33.00%%存数据组1到a矩阵中 ] b = [28.00, 31.25, 33.00, 29.75, 31.75, 29.25, 27.25, 27.25 29.75, 34.25, 38.25, 35.25, 36.75, 31.75, 27.50, 26.50 30.00, 37.00, 39.25, 38.25, 37.75, 33.00, 28.25, 26.75 29.50, 34.50, 39.25, 38.75, 37.00, 31.75, 27.25, 26.75 28.00, 31.00, 33.75, 34.25, 32.25, 28.75, 26.25, 26.25 26.75, 27.25, 28.25, 28.50, 27.25, 26.00, 26.75, 26.25 26.25, 26.50, 26.25, 26.00, 26.25, 26.50, 26.00, 26.00 27.50, 26.00, 26.50, 25.75, 26.00, 26.50, 26.25, 27.25%%存数据组2到b矩阵中 ] c = []; d = []; %构建插值后的矩阵c、d i=0; for hang=1:36%双线性插值 if hang==1 i=i+1; end if hang>2if rem(hang,5)==2 i=i+1; end endif rem(hang,5)==1 ku=0; endif rem(hang,5)==2 ku=0.2; endif rem(hang,5)==3 ku=0.4; endif rem(hang,5)==4 ku=0.8; endif rem(hang,5)==0 ku=1; end if hang==6 || hang==11 || ... hang==16 || hang==21 || ... hang==26 || hang==31 || ... hang==36 ku=1; endj=0; for lie=1:36 if lie==1 j=j+1; end if lie>2if rem(lie,5)==2 j=j+1; end end if rem(lie,5)==1 kv=0; end if rem(lie,5)==2 kv=0.2; end if rem(lie,5)==3 kv=0.4; end if rem(lie,5)==4 kv=0.6; end if rem(lie,5)==0 kv=0.8; end if lie==6 || lie==11 ||... lie==16 || lie==21 ||... lie==26 || lie==31 || ... lie==36 kv=1; end u=ku; v=kv; c(hang,lie)=(1-u)*(1-v)*b(i,j)...%%利用权重公式进行赋值 +(1-u)*v*b(i,j+1)... +u*(1-v)*b(i+1,j)... +u*v*b(i+1,j+1); d(hang,lie)=(1-u)*(1-v)*a(i,j)... +(1-u)*v*a(i,j+1)... +u*(1-v)*a(i+1,j)... +u*v*a(i+1,j+1); end end subplot(2,2,1)%显示原有像素图以及插值后的像素图 imagesc(b); subplot(2,2,2) imagesc(c); subplot(2,2,3) imagesc(a); subplot(2,2,4) imagesc(d);

效果如图所示:
胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

3.2 双三次插值
利用MATLAB自带的函数imresize函数,可以快速的给矩阵进行双三次插值。imrersize 函数由参数method指定的插值运算来改变图像的大小。method的几种可选值: nearest(默认值)为最近邻插值,此种插值效果不好,因而放弃使用;bilinear为双线性插值,上述以做了双线性插值,因此也不再赘述;bicubic为 双三次插值 ,它是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。借用MATLAB自带的库,我们可以快速对图像或者矩阵进行双三次插值。下图分别为将矩阵的行和列分别放大4.5倍和45倍的效果图。
胡乱捣鼓|胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化
文章图片

代码如下:
clc; clear; b = [28.00, 31.25, 33.00, 29.75, 31.75, 29.25, 27.25, 27.25 29.75, 34.25, 38.25, 35.25, 36.75, 31.75, 27.50, 26.50 30.00, 37.00, 39.25, 38.25, 37.75, 33.00, 28.25, 26.75 29.50, 34.50, 39.25, 38.75, 37.00, 31.75, 27.25, 26.75 28.00, 31.00, 33.75, 34.25, 32.25, 28.75, 26.25, 26.25 26.75, 27.25, 28.25, 28.50, 27.25, 26.00, 26.75, 26.25 26.25, 26.50, 26.25, 26.00, 26.25, 26.50, 26.00, 26.00 27.50, 26.00, 26.50, 25.75, 26.00, 26.50, 26.25, 27.25 ] t=imresize(b,45,'bicubic'); %45倍插值 imagesc(t);

4.准备利用AMG8833模块和arduino做一个低成本的DIY热成像相机,利用双线性插值插值完成后,实时投影到tft的显示屏中!

    推荐阅读