前言
图像缩放是最常用的图像操作,最近实现了一次双线性插值,适用于单通道8位灰度图像,可以同时处理缩小,放大。
加速手段有三个:1) 使用可分离方式,先后处理行和列, 2)构建缓冲区,以避免对某些行重复插值。3) 使用整形运算,避免浮点运算。
代码
typedef struct _Image{
int w;
int h;
int c;
int step;
int type;
void* data;
} Image;
static void _ieInterpImageBilinear8UC1_RowFilter(unsigned char* src, long* dst, int len, int* leftIdx, int* rightIdx, long* weight, int shift)
{
int i, j;
for(i = 0, j = 1; i < len - 2; i+=2, j+=2){
dst[i] = ((1<<shift) - weight[i])*src[leftIdx[i]] + weight[i]*src[rightIdx[i]];
dst[j] = ((1<<shift) - weight[j])*src[leftIdx[j]] + weight[j]*src[rightIdx[j]];
}
for( ; j < len; j++){
dst[j] = ((1<<shift) - weight[j])