MLX90640 紅外熱成像儀測(cè)溫模塊開(kāi)發(fā)筆記(四)
MLX90640 紅外熱成像儀測(cè)溫模塊開(kāi)發(fā)筆記(四)損壞和不良像素的處理
如前“開(kāi)發(fā)筆記(一)”所說(shuō),MLX90640 可能存在不超過(guò) 4 個(gè)像素的損壞或者不良像素,在溫度計(jì)算過(guò)程完成后,這些不良像素點(diǎn)會(huì)得到錯(cuò)誤的溫度數(shù)據(jù),對(duì)于處理這些不良數(shù)據(jù) MLX 也給出了推薦方法和具體的函數(shù)。(其實(shí)就是找相鄰的正常的溫度數(shù)據(jù)取平均來(lái)代替不良數(shù)據(jù))
前面開(kāi)發(fā)筆記(一)的內(nèi)容中所說(shuō)的 API 庫(kù),里面缺少了對(duì)不良像素點(diǎn)的處理函數(shù),在這里補(bǔ)上。
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<n-1; i++)
{
for(int j=i+1; j<n; 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;
}
}
用法很簡(jiǎn)單,在開(kāi)發(fā)筆記(三)MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp);之后添加兩行即可。如下(斜體是添加的內(nèi)容):
……
MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp); MLX90640_BadPixelsCorrection(MLXPars.brokenPixels, Temp, 1, MLXPars); MLX90640_BadPixelsCorrection(MLXPars.outlierPixels, Temp, 1, MLXPars);
……
/*
經(jīng)過(guò)上面的處理后,Temp 中的損壞和不良像素點(diǎn)已經(jīng)處理,Temp 數(shù)組中是處理完成后的
768 個(gè)溫度值。
*/
成果展示。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。