unsigned char Task::Interpolation (unsigned char *lpDIBBits, LONG lWidth, LONG lHeight, FLOAT x, FLOAT y)
{
LONG i1, i2;
LONG j1, j2;
unsigned char f1, f2, f3, f4;
unsigned char f12, f34;
FLOAT EXP;
int lineByte=(m_imgWidth/8+3)/4*4;
EXP = (FLOAT) 0.0001;
i1 = (LONG) x;
i2 = i1 + 1;
j1 = (LONG) y;
j2 = j1 + 1;
if( (x < 0) || (x > lWidth - 1) || (y < 0) || (y > lHeight - 1))
{
return 255;
}
else
{
if (fabs(x - lWidth + 1) <= EXP)
{
if (fabs(y - lHeight + 1) <= EXP)
{
f1 = *(m_pImgData + lineByte *
(lHeight - 1 - j1) + i1);
return f1;
}
else
{
f1 = *(m_pImgData + lineByte *
(lHeight - 1 - j1) + i1);
f3 = *(m_pImgData + lineByte *
(lHeight - 1 - j1) + i2);
// 返回插值结果
return ((unsigned char) (f1 + (y -j1) * (f3 - f1)));
}
}
else if (fabs(y - lHeight + 1) <= EXP)
{
// 要计算的点在图像下边缘上且不是最后一点,直接一次插值即可
f1 = *(m_pImgData + lineByte * (lHeight - 1 - j1) + i1);
f2 = *(m_pImgData + lineByte * (lHeight - 1 - j2) + i1);
// 返回插值结果
return ((unsigned char) (f1 + (x -i1) * (f2 - f1)));
}
else
{
// 计算四个最临近象素值
f1 = *(m_pImgData + lineByte* (lHeight - 1 - j1) + i1);
f2 = *(m_pImgData + lineByte * (lHeight - 1 - j2) + i1);
f3 = *(m_pImgData + lineByte * (lHeight - 1 - j1) + i2);
f4 = *(m_pImgData + lineByte * (lHeight - 1 - j2) + i2);
// 插值1
f12 = (unsigned char) (f1 + (x - i1) * (f2 - f1));
// 插值2
f34 = (unsigned char) (f3 + (x - i1) * (f4 - f3));
return ((unsigned char) (f12+(y-j1)*(f34-f12)));
}
}
}
双线性插值
最新推荐文章于 2023-09-12 17:53:17 发布