您的位置:首页 > 编程语言 > C语言/C++

双线性插值

2013-11-11 22:06 176 查看
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)));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息