使用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分辨率屏的时间测试

MLX90640 红外热成像仪测温传感器模块开发笔记红外图像伪彩色编码

MLX90640 红外热成像仪测温模块开发笔记

MLX90640 红外热成像仪测温传感器模块开发笔记

MLX90640 红外热成像仪测温模块开发笔记(完整篇)