//Ugly code to convert bayer to rgb
//test__1604x1206_10_2b.raw
//test__1284x966_10_3.raw
#include
unsigned short int bayerImage[2500][3500]; //times 3 allows for forming an RGB image for debugging
unsigned char bmpImage[30000000]; //times 3 allows for forming an RGB image for debugging
#include
#include
#include "bayer2rgb.h"
#include
#include
/*****************************************************************************
**
*/
int DumpImage( char* pszFilename, BYTE* pImage, int bmpWidth, int bmpHeight,int bmpBits,int bmpFormat)
{
FILE *bayerFile;
FILE *rgbFile;
int x,y;
unsigned char lowOrder,highOrder;
unsigned char bmpchar;
unsigned short bayerVal;
unsigned char bmpheader[62];
char FullFilename[MY_MAX_PATH];
unsigned int bmrgbFilesize;
unsigned int minPixel=100000;
unsigned int maxPixel=0;
static unsigned int rgbValues[4][1024];
/*expecting 10 bit bayer */
if(bmpBits!=10)
{
printf("invalid bit specification\n");
return(-1);
}
if(bmpHeight >= 0)
{
bmrgbFilesize = (((bmpWidth*24+31)/32)*4)*bmpHeight;
}
else
{
bmrgbFilesize = (((bmpWidth*24+31)/32)*4)*(-bmpHeight);
}
#ifdef LINUX
strcpy( FullFilename, pszFilename );
rgbFile = fopen( FullFilename, "w+b" );
if( rgbFile )
#else
strcpy_s( FullFilename, sizeof(FullFilename), pszFilename );
errno_t errno;
errno = fopen_s( &bayerFile, FullFilename, "r+b" );
if(errno == 0)
{
printf("size %d", strlen(FullFilename)-4);
memcpy(&FullFilename[strlen(FullFilename)-4],".bmp",4);
errno = fopen_s( &rgbFile, FullFilename, "w+b" );
}
if ( errno == 0 )
#endif
{
/* 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 */
/* 0 R G R G R G 0 G R G R G R 0 B G B G B G */
/* 1 G B G B G B 1 B G B G B G 1 G R G R G R */
/* 2 R G R G R G 2 G R G R G R 2 B G B G B G */
/* 3 G B G B G B 3 B G B G B G 3 G R G R G R */
memset(bmpImage,255,sizeof(bmpImage));
switch(bmpFormat)
{
case 2:
// 0 1 2 3 4 5
// 0 G R G R G R
// 1 B G B G B G
// 2 G R G R G R
// 3 B G B G B G
for(y=0;y
{
for(x=0;x
{
lowOrder=fgetc(bayerFile);
highOrder=fgetc(bayerFile);
bayerVal=(highOrder * 0x100);
bayerVal+=lowOrder;
bayerImage[y][x]=bayerVal;
if(bayerVal
{
minPixel=bayerVal;
}
if(bayerVal>maxPixel)
{
maxPixel=bayerVal;
}
if(y%2==0)
{
if(x%2==0)
{
//green
bayerImage[y][x]=bayerVal/2;
//if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;
//bayerImage[y][x]*=.65;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[0][bayerVal]++;
}
else
{
//red
bayerImage[y][x]=bayerVal/2;
//if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;
//bayerImage[y][x]*=.85;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[1][bayerVal]++;
}
}
else
{
if(x%2==0)
{
//blue
bayerImage[y][x]=bayerVal/2;
//if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;
//bayerImage[y][x]*=.85;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[2][bayerVal]++;
}
else
{
//green
bayerImage[y][x]=bayerVal/2;
//if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;
//bayerImage[y][x]*=.65;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[3][bayerVal]++;
}
}
}
}
for(y=1;y
{
for(x=1;x
{
bmpchar=bayerImage[y][x]/4;
if(y%2==0)
{
if(x%2==0)
{
//green pixel bayerImage[y][x]
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//red
}
else
{
//red pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x]);//red
}
}
else
{
if(x%2==0)
{
//blue pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=bayerImage[y][x];//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//red
}
else
{
//green pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//red
}
}
}
}
break;
case 3:
printf("format 3\n");
// 0 1 2 3 4 5
// 0 R G R G R G
// 1 G B G B G B
// 2 R G R G R G
// 3 G B G B G B
for(y=0;y
{
for(x=0;x
{
lowOrder=fgetc(bayerFile);
highOrder=fgetc(bayerFile);
bayerVal=(highOrder * 0x100);
bayerVal+=lowOrder;
bayerImage[y][x]=bayerVal;
if(bayerVal
{
minPixel=bayerVal;
}
if(bayerVal>maxPixel)
{
maxPixel=bayerVal;
}
if(y%2==0)
{
if(x%2==0)
{
//red
bayerImage[y][x]=bayerVal;
if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;
//bayerImage[y][x]*=.85;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[1][bayerVal]++;
}
else
{
//green
bayerImage[y][x]=bayerVal;
if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;
bayerImage[y][x]*=.65;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[0][bayerVal]++;
}
}
else
{
if(x%2==0)
{
//green
bayerImage[y][x]=bayerVal;
if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;
bayerImage[y][x]*=.65;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[3][bayerVal]++;
}
else
{
//blue
bayerImage[y][x]=bayerVal;
if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;
//bayerImage[y][x]*=.85;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[2][bayerVal]++;
}
}
}
}
for(y=1;y
{
for(x=1;x
{
bmpchar=bayerImage[y][x]/4;
if(y%2==0)
{
if(x%2==0)
{
//red pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=bayerImage[y][x];//red
}
else
{
//green pixel bayerImage[y][x]
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//red
}
}
else
{
if(x%2==0)
{
//green pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//red
}
else
{
//blue pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=bayerImage[y][x];//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//red
}
}
}
}
break;
case 4:
// 0 1 2 3 4 5
// 0 G R G R G R
// 1 B G B G B G
// 2 G R G R G R
// 3 B G B G B G
for(y=0;y
{
for(x=0;x
{
lowOrder=fgetc(bayerFile);
highOrder=fgetc(bayerFile);
bayerVal=(highOrder * 0x100);
bayerVal+=lowOrder;
bayerImage[y][x]=bayerVal;
if(bayerVal
{
minPixel=bayerVal;
}
if(bayerVal>maxPixel)
{
maxPixel=bayerVal;
}
if(y%2==0)
{
if(x%2==0)
{
//green
bayerImage[y][x]=bayerVal;
if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;
bayerImage[y][x]*=.65;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[0][bayerVal]++;
}
else
{
//red
bayerImage[y][x]=bayerVal;
if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;
//bayerImage[y][x]*=.85;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[1][bayerVal]++;
}
}
else
{
if(x%2==0)
{
//blue
bayerImage[y][x]=bayerVal;
if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;
//bayerImage[y][x]*=.85;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[2][bayerVal]++;
}
else
{
//green
bayerImage[y][x]=bayerVal;
if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;
bayerImage[y][x]*=.65;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[3][bayerVal]++;
}
}
}
}
for(y=1;y
{
for(x=1;x
{
bmpchar=bayerImage[y][x]/4;
if(y%2==0)
{
if(x%2==0)
{
//green pixel bayerImage[y][x]
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x]+bayerImage[y][x+1]+bayerImage[y+1][x])/3;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=bmpImage[(((y*bmpWidth)+x)*3)+0];//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=bmpImage[(((y*bmpWidth)+x)*3)+0];//red
}
else
{
//red pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x]+bayerImage[y][x+1]+bayerImage[y+1][x+1])/3;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=bmpImage[(((y*bmpWidth)+x)*3)+0];//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=bmpImage[(((y*bmpWidth)+x)*3)+0];//red
}
}
else
{
if(x%2==0)
{
//blue pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x]+bayerImage[y+1][x]+bayerImage[y+1][x+1])/3;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=bmpImage[(((y*bmpWidth)+x)*3)+0];//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=bmpImage[(((y*bmpWidth)+x)*3)+0];//red
}
else
{
//green pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x]+bayerImage[y][x+1]+bayerImage[y+1][x])/3;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=bmpImage[(((y*bmpWidth)+x)*3)+0];//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=bmpImage[(((y*bmpWidth)+x)*3)+0];//red
}
}
}
}
break;
case 5:
// 0 1 2 3 4 5
// 0 G R G R G R
// 1 B G B G B G
// 2 G R G R G R
// 3 B G B G B G
for(y=0;y
{
for(x=0;x
{
lowOrder=fgetc(bayerFile);
highOrder=fgetc(bayerFile);
bayerVal=(highOrder * 0x100);
bayerVal+=lowOrder;
bayerImage[y][x]=bayerVal;
if(bayerVal
{
minPixel=bayerVal;
}
if(bayerVal>maxPixel)
{
maxPixel=bayerVal;
}
if(y%2==0)
{
if(x%2==0)
{
//green
bayerImage[y][x]=bayerVal;
//if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;
bayerImage[y][x]/=256;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[0][bayerVal]++;
}
else
{
//red
bayerImage[y][x]=bayerVal;
//if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;
bayerImage[y][x]/=256;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[1][bayerVal]++;
}
}
else
{
if(x%2==0)
{
//blue
bayerImage[y][x]=bayerVal;
//if (bayerImage[y][x] >= 10) bayerImage[y][x]-=10; else bayerImage[y][x]=0;
bayerImage[y][x]/=256;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[2][bayerVal]++;
}
else
{
//green
bayerImage[y][x]=bayerVal;
//if (bayerImage[y][x] >= 20) bayerImage[y][x]-=20; else bayerImage[y][x]=0;
bayerImage[y][x]/=256;
if(bayerImage[y][x]>255)
bayerImage[y][x]=255;
rgbValues[3][bayerVal]++;
}
}
}
}
for(y=1;y
{
for(x=1;x
{
bmpchar=bayerImage[y][x]/4;
if(y%2==0)
{
if(x%2==0)
{
//green pixel bayerImage[y][x]
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//red
}
else
{
//red pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y][x]);//red
}
}
else
{
if(x%2==0)
{
//blue pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=bayerImage[y][x];//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y-1][x]+bayerImage[y+1][x]+bayerImage[y][x-1]+bayerImage[y][x+1])/4;//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/4;//red
}
else
{
//green pixel
bmpImage[(((y*bmpWidth)+x)*3)+0]=(bayerImage[y][x-1]+bayerImage[y][x+1])/2;//blue
bmpImage[(((y*bmpWidth)+x)*3)+1]=(bayerImage[y][x]/2)+((bayerImage[y-1][x-1]+bayerImage[y-1][x+1]+bayerImage[y+1][x-1]+bayerImage[y+1][x+1])/8);//green
bmpImage[(((y*bmpWidth)+x)*3)+2]=(bayerImage[y-1][x]+bayerImage[y+1][x])/2;//red
}
}
}
}
break;
default:
printf("undefined bit format\n");
return(-3);
break;
}
bmpheader[0]='\x42';
bmpheader[1]='\x4d';
bmpheader[2]='\x38';
bmpheader[3]='\x00';
bmpheader[4]='\x90';
bmpheader[5]='\x00';
bmpheader[6]='\x00';
bmpheader[7]='\x00';
bmpheader[8]='\x00';
bmpheader[9]='\x00';
bmpheader[10]='\x36';
bmpheader[11]='\x00';
bmpheader[12]='\x00';
bmpheader[13]='\x00';
bmpheader[14]='\x28';
bmpheader[15]='\x00';
bmpheader[16]='\x00';
bmpheader[17]='\x00';
bmpheader[18]='\x00';
bmpheader[19]='\x08';
bmpheader[20]='\x00';
bmpheader[21]='\x00';
bmpheader[22]='\x00';
bmpheader[23]='\x06';
bmpheader[24]='\x00';
bmpheader[25]='\x00';
bmpheader[26]='\x01';
bmpheader[27]='\x00';
bmpheader[28]='\x18';
bmpheader[29]='\x00';
bmpheader[30]='\x00';
bmpheader[31]='\x00';
bmpheader[32]='\x00';
bmpheader[33]='\x00';
bmpheader[34]='\x00';
bmpheader[35]='\x00';
bmpheader[36]='\x00';
bmpheader[37]='\x00';
bmpheader[38]='\x5a';
bmpheader[39]='\x37';
bmpheader[40]='\x00';
bmpheader[41]='\x00';
bmpheader[42]='\x5a';
bmpheader[43]='\x37';
bmpheader[44]='\x00';
bmpheader[45]='\x00';
bmpheader[46]='\x00';
bmpheader[47]='\x00';
bmpheader[48]='\x00';
bmpheader[49]='\x00';
bmpheader[50]='\x00';
bmpheader[51]='\x00';
bmpheader[52]='\x00';
bmpheader[53]='\x00';
memcpy(&bmpheader[2],&bmrgbFilesize,4);
memcpy(&bmpheader[18],&bmpWidth,4);
memcpy(&bmpheader[22],&bmpHeight,4);
fwrite( bmpheader, 1, 54, rgbFile );
fwrite( pImage, 1, bmrgbFilesize, rgbFile );
fclose( rgbFile );
fclose( bayerFile );
return(1);
}
return(-2);
} // end DumpImage()
int main(int argc, char* argv[])
{
if(argc !=2)
{
printf("wrong number of arugments\n");
printf("drag file to decode on top of program icon\n");
return(-1);
}
else
{
printf("%s\n",argv[0]);
printf("%s\n",argv[1]);
}
/*
char *str = "sdfadabcGGGGGGGGG";
char *result = strstr(str, "abc");
int position = result - str;
int substringLength = strlen(str) - position;
*/
char *widthStr = strstr(argv[1],"__")+2;
int widthInt=atoi(widthStr);
char *heightStr = strstr(widthStr,"x")+1;
int heightInt=atoi(heightStr);
char *bitsStr = strstr(heightStr,"_")+1;
int bitsInt=atoi(bitsStr);
char *formatStr = strstr(bitsStr,"_")+1;
int formatInt=atoi(formatStr);
//DumpImage( argv[1], bmpImage, widthInt, heightInt,bitsInt,formatInt);
DumpImage( argv[1], bmpImage, widthInt, heightInt,bitsInt,2);
printf("done\n");
return 1;
}