插值算法,需要填补缺失的2个色彩,我们使用的是线性插值补偿算法R 和B通过线性
就是RB分别不变,一个像素点的RGB 三个分量,通过固定其中的一个点的值,取临域的
的颜色分量的平均值,作为这个像素点的颜色分量值,因为绿色颜色分量数量在GRB模式的时候最多,所以对于G颜色分量的时候需要做两次的运算
R如果固定的是红色分量的时候即R在中间,为第三张图,固定R的颜色分量,上下左右的G相加除以4,还有临近的B相加除以4,代码实现是:
这边是一格格的寻找插值,只是我们的算法对边缘没有做处理,所以需要-1
For(i=0;i<width-1;i++)
{
For(j=0;j<height-1;j++)
{
Int seq=j*width+i;//定义的绘出IMAGE区域用于指向首地址
If(1==i%2&&0==j%2)//因为R 的分量在GRGB的格式中只会出现在奇数的列和偶数的行所以这样判断
{
Pixel.red = *(inbuf+seq);
Pixel.greed=(*(inbuf+seq+1)+*(inbuf+seq-1)+*(inbuf+seq+width)+*(inbuf+seq-width))>>2;//取临近的绿色分量的平均值用于填充像素点
Pixel.blue=(*(inbuf+Seq+1+width)+*(inbuf+seq-width)+*(inbuf+seq+width+1)+*(inbuf+seq+width-1))>>2;//取临近的蓝色分量的临近值用于插值
}
//固定绿色分量,因为绿色分量只在偶数行偶数列或者奇数行技术列出现所以如下
//绿色是上下左右的红与绿相加除2
If(i%2==1&&j%2==1)
{
Pixel.green = *(inbuf+seq);
Pixel.red=(*(inbuf+Seq+width)+*(inbuf+seq-width))>>1;
Pixel.blue=(*(inbuf+seq+1)+*(inbuf+seq-1))>>1;
Bmp->pixels[i][j]=pixel;
}
//第二种情况
If(0==i%2&&0==j%2){
Pixel.green=*(inbuf+Seq);
Pixel.red=(*(inbuf+seq+1)+*(inbuf+seq-1))>>1;
Pixel.blue==(*(inbuf+Seq+width)+*(inbuf+seq-width))>>1;
Bmp->pixels[i][j]=pixles;
}
Else
{
Pixel.blue=(*(inBuf+seq-1-width)+*(inBuf+seq+1-width)+*(inBuf+seq-1+width)+*(inBuf+seq+1+width))>>2;
Pixel.green= (*(inbuf+seq+width)+*(inbuf+seq-width)+*(inbuf+seq+1)+*(inbuf+seq-1))>>2;
Pixel.red=
}
bmp->pixels[i][j]= pixel;
}
}
如上可以将原始的RAW数据在新的内存中将像素点颜色比例重新配置绘出彩图,就是颜色会有点偏绿
参考博客地址:http://www.cnblogs.com/qiqibaby/p/5267566.html