MLX90640 红外热成像仪测温模块开发笔记(四)损坏和不良像素的处理
如前“开发笔记(一)”所说,MLX90640 可能存在不超过4个像素的损坏或者不良像素,在温度计算过程完成后,这些不良像素点会得到错误的温度数据,对于处理这些不良数据 MLX 也给出了推荐方法和具体的函数。(其实就是找相邻的正常的温度数据取平均来代替不良数据)
河北稳控科技红外热成像测温模块
前面开发笔记(一)的内容中所说的 API库,里面缺少了对不良像素点的处理函数,在这里补上。
int CheckAdjacentPixels(uint16_t pix1, uint16_t pix2)
{
int pixPosDif;
pixPosDif = pix1 - pix2;
if(pixPosDif > -34 && pixPosDif < -30)
{
return -6;
}
if(pixPosDif > -2 && pixPosDif < 2)
{
return -6;
}
if(pixPosDif > 30 && pixPosDif < 34)
{
return -6;
}
return 0;
}
float GetMedian(float *values, int n)
{
float temp;
for(int i=0; i { for(int j=i+1; j { if(values[j] < values[i]) { temp = values[i]; values[i] = values[j]; values[j] = temp; } } if(n%2==0) { return ((values[n/2] + values[n/2 - 1]) / 2.0); } else { } return values[n/2]; } int IsPixelBad(uint16_t pixel,paramsMLX90640 *params) { for(int i=0; i<5; i++) { if(pixel == params->outlierPixels[i] || pixel == params->brokenPixels[i]) { return 1; } } return 0; } void MLX90640_BadPixelsCorrection(uint16_t *pixels, float *to, int mode, paramsMLX90640 *params) { float ap[4]; uint8_t pix; uint8_t line; uint8_t column; pix = 0; while(pixels[pix] != 0xFFFF) { line = pixels[pix]>>5; column = pixels[pix] - (line<<5); if(mode == 1) { if(line == 0) { if(column == 0) { to[pixels[pix]] = to[33]; } else if(column == 31) { } else { } } to[pixels[pix]] = to[62]; to[pixels[pix]] = (to[pixels[pix]+31] + to[pixels[pix]+33])/2.0; else if(line == 23) { if(column == 0) { to[pixels[pix]] = to[705]; } else if(column == 31) { } else { } } to[pixels[pix]] = to[734]; to[pixels[pix]] = (to[pixels[pix]-33] + to[pixels[pix]-31])/2.0; else if(column == 0) { to[pixels[pix]] = (to[pixels[pix]-31] + to[pixels[pix]+33])/2.0; } else if(column == 31) { } else { to[pixels[pix]] = (to[pixels[pix]-33] + to[pixels[pix]+31])/2.0; ap[0] = to[pixels[pix]-33]; ap[1] = to[pixels[pix]-31]; ap[2] = to[pixels[pix]+31]; ap[3] = to[pixels[pix]+33]; to[pixels[pix]] = GetMedian(ap,4); } else { } if(column == 0) { to[pixels[pix]] = to[pixels[pix]+1]; } else if(column == 1 || column == 30) { to[pixels[pix]] = (to[pixels[pix]-1]+to[pixels[pix]+1])/2.0; } else if(column == 31) { } else { 0) to[pixels[pix]] = to[pixels[pix]-1]; if(IsPixelBad(pixels[pix]-2,params) == 0 && IsPixelBad(pixels[pix]+2,params) == { ap[0] = to[pixels[pix]+1] - to[pixels[pix]+2]; ap[1] = to[pixels[pix]-1] - to[pixels[pix]-2]; if(fabs(ap[0]) > fabs(ap[1])) { } else { } else { } to[pixels[pix]] = to[pixels[pix]-1] + ap[1]; to[pixels[pix]] = to[pixels[pix]+1] + ap[0]; to[pixels[pix]] = (to[pixels[pix]-1]+to[pixels[pix]+1])/2.0; } } } pix = pix + 1; } } 用法很简单,在开发笔记(三)MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp);之后添加两行即可。如下(斜体是添加的内容): …… MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp); MLX90640_BadPixelsCorrection(MLXPars.brokenPixels, Temp, 1, MLXPars); MLX90640_BadPixelsCorrection(MLXPars.outlierPixels, Temp, 1, MLXPars); …… /* 经过上面的处理后,Temp 中的损坏和不良像素点已经处理,Temp 数组是处理完成后的 768 个温度值。 */ 河北稳控科技红外热成像测温模块成果展示
留言与评论(共有 0 条评论)
“”