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

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

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

2.不足之处:该AMG8833红外热像仪传感器温度测量范围为0°C至80°C,精度为+ - 2.5°C。它可以从远达7米的距离检测物体。最大帧频为10Hz,非常适合创建人体探测器或迷你热像仪。
但是由于其返回的数据只有64个,所以直接利用这64个温度像素点来构建热成像的图像是极为不清晰的,这是AMG8833模块的最大的短板,也是实现热成像功能所要克服的至关重要的问题。下图是实测图与数据经MATLAB成像后的效果图。
胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第2张图片
胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第3张图片
由上图可知,直接将模块传回的8 * 8个数据成像后,只能稍微看出一杯热水的轮廓,因而AMG8833模块的精度是远远不够的,为此必须对8 * 8的数据进行处理。显然,要使得成像效果图更加圆滑清晰,需要对其进行插值处理。

3.插值处理
插值的任务是由已知的观测点为物理量,建立一个简单、连续的解析模型,以便能根据该模型推测物理量在非观测点处的特性。插值包括多项式插值、艾尔米特插值、分段插值和样条插值等等,其中最常见的有双线性插值和双三次插值。这里选用常见的双线性插值以及双三次插值。

3.1 双线性插值

确定了插值方式后,将AMG8833的一组数据导入MATLAB作为一个新的矩阵b,其某时刻的数据采集图及导入的数据如图所示。
胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第4张图片
胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第5张图片
因为回传的数据为8*8的一个网格数据,对于这种非函数关系的数据表,处理的方式会略有不同。先采用双线性插值的方法对数据进行插值处理。其原理较为简单,如下图所示,p点像素值决定于Q12、Q22、Q11、Q21这4个点的像素值。
胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第6张图片
先在X轴方向做2次插值操作(分别为R1和R2),然后在Y轴方向做一次插值操作§,相反的,也可以先在Y轴做2次插值操作,然后在X轴做一次插值操作。具体公式如下:
胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第7张图片
其中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);

效果如图所示:
胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第8张图片
胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第9张图片

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

胡乱捣鼓01——基于AMG8833热成像模块的插值显示优化_第10张图片

代码如下:

	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的显示屏中!

你可能感兴趣的:(胡乱捣鼓,matlab)