双线性插值
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))); } } }
相关文章推荐
- 双线性插值图像放大/缩小算法
- Bilinear interpolation--双线性插值
- .NET 图片双线性插值缩放算法
- 什么是线性插值原理 什么是双线性插值?
- 图像放缩中最近邻插值和双线性插值…
- 图像放缩中最近邻插值和双线性插值的基本原理
- opencv初探(二)——直方图均衡化与双线性插值缩放
- 图像放缩中最近邻插值和双线性插值的基本原理
- 图像双线性插值
- 双线性插值
- 双线性插值
- 双线性插值
- 图像放缩中最近邻插值和双线性插值的基本原理
- 实现双线性插值图形图像平面几何变换
- 线性插值和双线性插值
- OpenCL应用与双线性插值
- 图像处理之基础---图像缩放中的双线性插值c实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值
- 图像的放大与缩小(2)——双线性插值放大与均值缩小