胡乱捣鼓01——基于AMG8833热成像模块的显示优化
1.介绍一下AMG8833模块:松下品牌的AMG8833红外热像仪传感器是一个8*8的红外热传感器阵列,当连接到微控制器时,它将通过IIC返回一组64个单独的红外温度读数,紧凑而简单,便于集成。AMG8833提供比以前的AMG8831更高的性能,传感器仅支持IIC通讯,并且具有可配置的中断引脚,当任何单个像素高于或低于设置的阈值时,该引脚可以触发。
2.不足之处:该AMG8833红外热像仪传感器温度测量范围为0°C至80°C,精度为+ - 2.5°C。它可以从远达7米的距离检测物体。最大帧频为10Hz,非常适合创建人体探测器或迷你热像仪。
但是由于其返回的数据只有64个,所以直接利用这64个温度像素点来构建热成像的图像是极为不清晰的,这是AMG8833模块的最大的短板,也是实现热成像功能所要克服的至关重要的问题。下图是实测图与数据经MATLAB成像后的效果图。
由上图可知,直接将模块传回的8 * 8个数据成像后,只能稍微看出一杯热水的轮廓,因而AMG8833模块的精度是远远不够的,为此必须对8 * 8的数据进行处理。显然,要使得成像效果图更加圆滑清晰,需要对其进行插值处理。
3.插值处理
插值的任务是由已知的观测点为物理量,建立一个简单、连续的解析模型,以便能根据该模型推测物理量在非观测点处的特性。插值包括多项式插值、艾尔米特插值、分段插值和样条插值等等,其中最常见的有双线性插值和双三次插值。这里选用常见的双线性插值以及双三次插值。
3.1 双线性插值
确定了插值方式后,将AMG8833的一组数据导入MATLAB作为一个新的矩阵b,其某时刻的数据采集图及导入的数据如图所示。
因为回传的数据为8*8的一个网格数据,对于这种非函数关系的数据表,处理的方式会略有不同。先采用双线性插值的方法对数据进行插值处理。其原理较为简单,如下图所示,p点像素值决定于Q12、Q22、Q11、Q21这4个点的像素值。
先在X轴方向做2次插值操作(分别为R1和R2),然后在Y轴方向做一次插值操作§,相反的,也可以先在Y轴做2次插值操作,然后在X轴做一次插值操作。具体公式如下:
其中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>2
if rem(hang,5)==2
i=i+1;
end
end
if rem(hang,5)==1
ku=0;
end
if rem(hang,5)==2
ku=0.2;
end
if rem(hang,5)==3
ku=0.4;
end
if rem(hang,5)==4
ku=0.8;
end
if rem(hang,5)==0
ku=1;
end
if hang==6 || hang==11 || ...
hang==16 || hang==21 || ...
hang==26 || hang==31 || ...
hang==36
ku=1;
end
j=0;
for lie=1:36
if lie==1
j=j+1;
end
if lie>2
if 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);
3.2 双三次插值
利用MATLAB自带的函数imresize函数,可以快速的给矩阵进行双三次插值。imrersize 函数由参数method指定的插值运算来改变图像的大小。method的几种可选值: nearest(默认值)为最近邻插值,此种插值效果不好,因而放弃使用;bilinear为双线性插值,上述以做了双线性插值,因此也不再赘述;bicubic为 双三次插值 ,它是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。借用MATLAB自带的库,我们可以快速对图像或者矩阵进行双三次插值。下图分别为将矩阵的行和列分别放大4.5倍和45倍的效果图。
代码如下:
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的显示屏中!