使用MLX90640自制红外热像仪:图像插值图像彩色编码
Posted qlexcel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用MLX90640自制红外热像仪:图像插值图像彩色编码相关的知识,希望对你有一定的参考价值。
经过上一节,已经把MLX90640的32x24个像素点读出来了,可是使用32x24直接显示在屏幕上,显示区域显示太小了,于是就需要对图像就行放大。
图像插值
常见的插值算法可以分为两类:自适应和非自适应。 自适应的方法可以根据插值的内容来改变(尖锐的边缘或者是平滑的纹理),非自适应的方法对所有的像素点都进行同样的处理。 非自适应算法包括:最近邻,双线性,双三次,样条,sinc,lanczos等。 由于其复杂度, 这些插值的时候使用从0 to 256 (or more) 邻近像素。 包含越多的邻近像素,他们越精确,但是花费的时间也越长。这些算法可以用来扭曲和缩放照片。
具体实现可以参考这两篇文章,他们已经说得很详细了:图像插值算法总结、双线性内插值算法。
插补后的效果如下:
图像彩色编码
现在把32x24像素点放大了10倍,得到了320x240像素点,但是这些像素点还都是-40度到300度的温度值,要怎么转换成彩色来显示呢?
其实都已经有转换规范了,而且还有很多种方案:
温度转颜色的方法
(1)首先假设温度范围的上下限并将实际的温度数据转换为 0~255 之间的数值
(2)使用转换后的数值代入下面的伪彩编码计算函数,生成伪彩色
//伪彩 1
#define abs(x) ((x)>0?(x):-(x))
void GrayToPseColor(uint8_t grayValue, uint8_t *colorR,uint8_t *colorG,uint8_t *colorB)
{
*colorR=abs(0-grayValue);
*colorG=abs(127-grayValue);
*colorB=abs(255-grayValue);
}
伪彩 2、金属、彩虹、灰度编码的转换函数为:
void GrayToPseColor(uint8_t converMethod,uint8_t grayValue, uint8_t *colorR,uint8_t *colorG,uint8_t *colorB) //灰度-伪彩色变换
{
switch(converMethod)
{
case GCM_Pseudo1:
*colorR=abs(0-grayValue);
*colorG=abs(127-grayValue);
*colorB=abs(255-grayValue);
break;
case GCM_Pseudo2:
if( (grayValue>=0) && (grayValue<=63) )
{
*colorR=0;
*colorG=0;
*colorB=round(grayValue/64*255);
}
else if( (grayValue>=64) && (grayValue<=127) )
{
*colorR=0;
*colorG=round((grayValue-64)/64*255);
*colorB=round((127-grayValue)/64*255);
}
else if( (grayValue>=128) && (grayValue<=191) )
{
*colorR=round((grayValue-128)/64*255);
*colorG=255;
*colorB=0;
}
else if( (grayValue>=192) && (grayValue<=255) )
{
*colorR=255;
*colorG=round((255-grayValue)/64*255);
*colorB=0;
}
break;
case GCM_Metal1:
if( (grayValue>=0) && (grayValue<=63) )
{
*colorR=0;
*colorG=0;
*colorB=round(grayValue/64*255);
}
else if( (grayValue>=64) && (grayValue<=95) )
{
*colorR=round((grayValue-63)/32*127);
*colorG=round((grayValue-63)/32*127);
*colorB=255;
}
else if( (grayValue>=96) && (grayValue<=127) )
{
*colorR=round((grayValue-95)/32*127)+128;
*colorG=round((grayValue-95)/32*127)+128;
*colorB=round((127-grayValue)/32*255);
}
else if( (grayValue>=128) && (grayValue<=191) )
{
*colorR=255;
*colorG=255;
*colorB=0;
}
else if( (grayValue>=192) && (grayValue<=255) )
{
*colorR=255;
*colorG=255;
*colorB=round((grayValue-192)/64*255);
}
break;
case GCM_Metal2:
*colorR=0;*colorG=0;*colorB=0;
if( (grayValue>=0) && (grayValue<=16) )
{
*colorR=0;
}
else if( (grayValue>=17) && (grayValue<=140) )
{
*colorR=round((grayValue-16)/(140-16)*255);
}
else if( (grayValue>=141) && (grayValue<=255) )
{
*colorR=255;
}
if( (grayValue>=0) && (grayValue<=101) )
{
*colorG=0;
}
else if( (grayValue>=102) && (grayValue<=218) )
{
*colorG=round((grayValue-101)/(218-101)*255);
}
else if( (grayValue>=219) && (grayValue<=255) )
{
*colorG=255;
}
if( (grayValue>=0) && (grayValue<=91) )
{
*colorB=28+round((grayValue-0)/(91-0)*100);
}
else if( (grayValue>=92) && (grayValue<=120) )
{
*colorB=round((120-grayValue)/(120-91)*128);
}
else if( (grayValue>=129) && (grayValue<=214) )
{
*colorB=0;
}
else if( (grayValue>=215) && (grayValue<=255) )
{
*colorB=round((grayValue-214)/(255-214)*255);
}
break;
case GCM_Rainbow1:
if( (grayValue>=0) && (grayValue<=31) )
{
*colorR=0;
*colorG=0;
*colorB=round(grayValue/32*255);
}
else if( (grayValue>=32) && (grayValue<=63) )
{
*colorR=0;
*colorG=round((grayValue-32)/32*255);
*colorB=255;
}
else if( (grayValue>=64) && (grayValue<=95) )
{
*colorR=0;
*colorG=255;
*colorB=round((95-grayValue)/32*255);
}
else if( (grayValue>=96) && (grayValue<=127) )
{
*colorR=round((grayValue-96)/32*255);
*colorG=255;
*colorB=0;
}
else if( (grayValue>=128) && (grayValue<=191) )
{
*colorR=255;
*colorG=round((191-grayValue)/64*255);
*colorB=0;
}
else if( (grayValue>=192) && (grayValue<=255) )
{
*colorR=255;
*colorG=round((grayValue-192)/64*255);//0
*colorB=round((grayValue-192)/64*255);
}
break;
case GCM_Rainbow2:
if( (grayValue>=0) && (grayValue<=63) )
{
*colorR=0;
*colorG=round((grayValue-0)/64*255);
*colorB=255;
}
else if( (grayValue>=64) && (grayValue<=95) )
{
*colorR=0;
*colorG=255;
*colorB=round((95-grayValue)/32*255);
}
else if( (grayValue>=96) && (grayValue<=127) )
{
*colorR=round((grayValue-96)/32*255);
*colorG=255;
*colorB=0;
}
else if( (grayValue>=128) && (grayValue<=191) )
{
*colorR=255;
*colorG=round((191-grayValue)/64*255);
*colorB=0;
}
else if( (grayValue>=192) && (grayValue<=255) )
{
*colorR=255;
*colorG=round((grayValue-192)/64*255);
*colorB=round((grayValue-192)/64*255);
}
break;
case GCM_Rainbow3:
if( (grayValue>=0) && (grayValue<=51) )
{
*colorR=0;
*colorG=grayValue*5;
*colorB=255;
}
else if( (grayValue>=52) && (grayValue<=102) )
{
*colorR=0;
*colorG=255;
*colorB=255-(grayValue-51)*5;
}
else if( (grayValue>=103) && (grayValue<=153) )
{
*colorR=(grayValue-102)*5;
*colorG=255;
*colorB=0;
}
else if( (grayValue>=154) && (grayValue<=204) )
{
*colorR=255;
*colorG=round(255-128*(grayValue-153)/51);
*colorB=0;
}
else if( (grayValue>=205) && (grayValue<=255) )
{
*colorR=255;
*colorG=round(127-127*(grayValue-204)/51);
*colorB=0;
}
break;
case GCM_Zhou:
if( (grayValue>=0) && (grayValue<=63) )
{
*colorR=0;
*colorG=round((64-grayValue)/64*255);
*colorB=255;
}
else if( (grayValue>=64) && (grayValue<=127) )
{
*colorR=0;
*colorG=round((grayValue-64)/64*255);
*colorB=round((127-grayValue)/64*255);
}
else if( (grayValue>=128) && (grayValue<=191) )
{
*colorR=round((grayValue-128)/64*255);
*colorG=255;
*colorB=0;
}
else if( (grayValue>=192) && (grayValue<=255) )
{
*colorR=255;
*colorG=使用MLX90640自制红外热像仪:API函数的使用
使用MLX90640自制红外热像仪:stm32f103c8t6刷320x240分辨率屏的时间测试