⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conversions.c

📁 Coriander is a GUI for controlling a Digital Camera (in the sense of the IIDC specs issued by the 1
💻 C
📖 第 1 页 / 共 2 页
字号:
    break;  }    switch (type) {  case COLOR_FILTER_FORMAT7_GRBG: //-------------------------------------------  case COLOR_FILTER_FORMAT7_GBRG:    // copy original RGB data to output images    for (i=0;i<sy;i+=2) {      for (j=0;j<sx;j+=2) {	outG[(i*sx+j)*3]=src[i*sx+j];	outG[((i+1)*sx+(j+1))*3]=src[(i+1)*sx+(j+1)];	outR[(i*sx+j+1)*3]=src[i*sx+j+1];	outB[((i+1)*sx+j)*3]=src[(i+1)*sx+j];      }    }    // R channel    for (i=0;i<sy;i+=2) {      for (j=0;j<sx-1;j+=2) {	outR[(i*sx+j)*3]=outR[(i*sx+j+1)*3];	outR[((i+1)*sx+j+1)*3]=outR[(i*sx+j+1)*3];	outR[((i+1)*sx+j)*3]=outR[(i*sx+j+1)*3];      }    }      // B channel    for (i=0;i<sy-1;i+=2)  { //every two lines      for (j=0;j<sx-1;j+=2) {	outB[(i*sx+j)*3]=outB[((i+1)*sx+j)*3];	outB[(i*sx+j+1)*3]=outB[((i+1)*sx+j)*3];	outB[((i+1)*sx+j+1)*3]=outB[((i+1)*sx+j)*3];      }    }    // using lower direction for G channel          // G channel    for (i=0;i<sy-1;i+=2)//every two lines      for (j=1;j<sx;j+=2)	outG[(i*sx+j)*3]=outG[((i+1)*sx+j)*3];          for (i=1;i<sy-2;i+=2)//every two lines      for (j=0;j<sx-1;j+=2)	outG[(i*sx+j)*3]=outG[((i+1)*sx+j)*3];        // copy it for the next line    for (j=0;j<sx-1;j+=2)      outG[((sy-1)*sx+j)*3]=outG[((sy-2)*sx+j)*3];        break;  case COLOR_FILTER_FORMAT7_BGGR: //-------------------------------------------  case COLOR_FILTER_FORMAT7_RGGB:    // copy original data    for (i=0;i<sy;i+=2) {      for (j=0;j<sx;j+=2) {	outB[(i*sx+j)*3]=src[i*sx+j];	outR[((i+1)*sx+(j+1))*3]=src[(i+1)*sx+(j+1)];	outG[(i*sx+j+1)*3]=src[i*sx+j+1];	outG[((i+1)*sx+j)*3]=src[(i+1)*sx+j];      }    }    // R channel    for (i=0;i<sy;i+=2){      for (j=0;j<sx-1;j+=2) {	outR[(i*sx+j)*3]=outR[((i+1)*sx+j+1)*3];	outR[(i*sx+j+1)*3]=outR[((i+1)*sx+j+1)*3];	outR[((i+1)*sx+j)*3]=outR[((i+1)*sx+j+1)*3];      }    }    // B channel    for (i=0;i<sy-1;i+=2) { //every two lines      for (j=0;j<sx-1;j+=2) {	outB[((i+1)*sx+j)*3]=outB[(i*sx+j)*3];	outB[(i*sx+j+1)*3]=outB[(i*sx+j)*3];	outB[((i+1)*sx+j+1)*3]=outB[(i*sx+j)*3];      }    }    // using lower direction for G channel        // G channel    for (i=0;i<sy-1;i+=2)//every two lines      for (j=0;j<sx-1;j+=2)	outG[(i*sx+j)*3]=outG[((i+1)*sx+j)*3];        for (i=1;i<sy-2;i+=2)//every two lines      for (j=0;j<sx-1;j+=2)	outG[(i*sx+j+1)*3]=outG[((i+1)*sx+j+1)*3];        // copy it for the next line    for (j=0;j<sx-1;j+=2)      outG[((sy-1)*sx+j+1)*3]=outG[((sy-2)*sx+j+1)*3];        break;      default:  //-------------------------------------------    fprintf(stderr,"Bad Bayer pattern ID: %d\n",type);    return;    break;  }}voidBayerEdgeSense(unsigned char *src, unsigned char *dest, int sx, int sy, int type){  unsigned char *outR=NULL, *outG=NULL, *outB=NULL;  register int i,j;  int dh, dv;  int tmp;  // sx and sy should be even  switch (type) {  case COLOR_FILTER_FORMAT7_GRBG:  case COLOR_FILTER_FORMAT7_BGGR:    outR=&dest[0];    outG=&dest[1];    outB=&dest[2];    break;  case COLOR_FILTER_FORMAT7_GBRG:  case COLOR_FILTER_FORMAT7_RGGB:    outR=&dest[2];    outG=&dest[1];    outB=&dest[0];    break;  default:    fprintf(stderr,"Bad Bayer pattern ID: %d\n",type);    return;    break;  }  switch (type) {  case COLOR_FILTER_FORMAT7_GRBG://---------------------------------------------------------  case COLOR_FILTER_FORMAT7_GBRG:    // copy original RGB data to output images    for (i=0;i<sy;i+=2) {      for (j=0;j<sx;j+=2) {	outG[(i*sx+j)*3]=src[i*sx+j];	outG[((i+1)*sx+(j+1))*3]=src[(i+1)*sx+(j+1)];	outR[(i*sx+j+1)*3]=src[i*sx+j+1];	outB[((i+1)*sx+j)*3]=src[(i+1)*sx+j];      }    }    // process GREEN channel    for (i=3;i<sy-2;i+=2) {      for (j=2;j<sx-3;j+=2) {	dh=abs((outB[(i*sx+j-2)*3]+outB[(i*sx+j+2)*3])/2-outB[(i*sx+j)*3]);	dv=abs((outB[((i-2)*sx+j)*3]+outB[((i+2)*sx+j)*3])/2-outB[(i*sx+j)*3]);	if (dh<dv)	  tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3])/2;	else {	  if (dh>dv)	    tmp=(outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/2;	  else	    tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3]+outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/4;	}	CLIP(tmp,outG[(i*sx+j)*3]);      }    }    for (i=2;i<sy-3;i+=2) {      for (j=3;j<sx-2;j+=2) {	dh=abs((outR[(i*sx+j-2)*3]+outR[(i*sx+j+2)*3])/2-outR[(i*sx+j)*3]);	dv=abs((outR[((i-2)*sx+j)*3]+outR[((i+2)*sx+j)*3])/2-outR[(i*sx+j)*3]);	if (dh<dv)	  tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3])/2;	else {	  if (dh>dv)	    tmp=(outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/2;	  else	    tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3]+outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/4;	} 	CLIP(tmp,outG[(i*sx+j)*3]);      }    }    // process RED channel    for (i=0;i<sy-1;i+=2) {      for (j=2;j<sx-1;j+=2) {	tmp=outG[(i*sx+j)*3]+(outR[(i*sx+j-1)*3]-outG[(i*sx+j-1)*3]+			      outR[(i*sx+j+1)*3]-outG[(i*sx+j+1)*3])/2;	CLIP(tmp,outR[(i*sx+j)*3]);      }    }    for (i=1;i<sy-2;i+=2) {      for (j=1;j<sx;j+=2) {	tmp=outG[(i*sx+j)*3]+(outR[((i-1)*sx+j)*3]-outG[((i-1)*sx+j)*3]+			      outR[((i+1)*sx+j)*3]-outG[((i+1)*sx+j)*3])/2;	CLIP(tmp,outR[(i*sx+j)*3]);      }      for (j=2;j<sx-1;j+=2) {	tmp=outG[(i*sx+j)*3]+(outR[((i-1)*sx+j-1)*3]-outG[((i-1)*sx+j-1)*3]+			      outR[((i-1)*sx+j+1)*3]-outG[((i-1)*sx+j+1)*3]+			      outR[((i+1)*sx+j-1)*3]-outG[((i+1)*sx+j-1)*3]+			      outR[((i+1)*sx+j+1)*3]-outG[((i+1)*sx+j+1)*3])/4;	CLIP(tmp,outR[(i*sx+j)*3]);      }    }          // process BLUE channel    for (i=1;i<sy;i+=2) {      for (j=1;j<sx-2;j+=2) {	tmp=outG[(i*sx+j)*3]+(outB[(i*sx+j-1)*3]-outG[(i*sx+j-1)*3]+			      outB[(i*sx+j+1)*3]-outG[(i*sx+j+1)*3])/2;	CLIP(tmp,outB[(i*sx+j)*3]);      }    }    for (i=2;i<sy-1;i+=2) {      for (j=0;j<sx-1;j+=2) {	tmp=outG[(i*sx+j)*3]+(outB[((i-1)*sx+j)*3]-outG[((i-1)*sx+j)*3]+			      outB[((i+1)*sx+j)*3]-outG[((i+1)*sx+j)*3])/2;	CLIP(tmp,outB[(i*sx+j)*3]);      }      for (j=1;j<sx-2;j+=2) {	tmp=outG[(i*sx+j)*3]+(outB[((i-1)*sx+j-1)*3]-outG[((i-1)*sx+j-1)*3]+			      outB[((i-1)*sx+j+1)*3]-outG[((i-1)*sx+j+1)*3]+			      outB[((i+1)*sx+j-1)*3]-outG[((i+1)*sx+j-1)*3]+			      outB[((i+1)*sx+j+1)*3]-outG[((i+1)*sx+j+1)*3])/4;	CLIP(tmp,outB[(i*sx+j)*3]);      }    }      break;  case COLOR_FILTER_FORMAT7_BGGR: //---------------------------------------------------------  case COLOR_FILTER_FORMAT7_RGGB:    // copy original RGB data to output images    for (i=0;i<sy;i+=2) {      for (j=0;j<sx;j+=2) {	outB[(i*sx+j)*3]=src[i*sx+j];	outR[((i+1)*sx+(j+1))*3]=src[(i+1)*sx+(j+1)];	outG[(i*sx+j+1)*3]=src[i*sx+j+1];	outG[((i+1)*sx+j)*3]=src[(i+1)*sx+j];      }    }    // process GREEN channel    for (i=2;i<sy-2;i+=2) {      for (j=2;j<sx-3;j+=2) {	dh=abs((outB[(i*sx+j-2)*3]+outB[(i*sx+j+2)*3])/2-outB[(i*sx+j)*3]);	dv=abs((outB[((i-2)*sx+j)*3]+outB[((i+2)*sx+j)*3])/2-outB[(i*sx+j)*3]);	if (dh<dv)	  tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3])/2;	else {	  if (dh>dv)	    tmp=(outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/2;	  else	    tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3]+outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/4;	}	CLIP(tmp,outG[(i*sx+j)*3]);      }    }    for (i=3;i<sy-3;i+=2) {      for (j=3;j<sx-2;j+=2) {	dh=abs((outR[(i*sx+j-2)*3]+outR[(i*sx+j+2)*3])/2-outR[(i*sx+j)*3]);	dv=abs((outR[((i-2)*sx+j)*3]+outR[((i+2)*sx+j)*3])/2-outR[(i*sx+j)*3]);	if (dh<dv)	  tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3])/2;	else {	  if (dh>dv)	    tmp=(outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/2;	  else	    tmp=(outG[(i*sx+j-1)*3]+outG[(i*sx+j+1)*3]+outG[((i-1)*sx+j)*3]+outG[((i+1)*sx+j)*3])/4;	}	CLIP(tmp,outG[(i*sx+j)*3]);      }    }    // process RED channel    for (i=1;i<sy-1;i+=2) { // G-points (1/2)      for (j=2;j<sx-1;j+=2) {	tmp=outG[(i*sx+j)*3]+(outR[(i*sx+j-1)*3]-outG[(i*sx+j-1)*3]+			      outR[(i*sx+j+1)*3]-outG[(i*sx+j+1)*3])/2;	CLIP(tmp,outR[(i*sx+j)*3]);      }    }    for (i=2;i<sy-2;i+=2)  {      for (j=1;j<sx;j+=2) { // G-points (2/2)	tmp=outG[(i*sx+j)*3]+(outR[((i-1)*sx+j)*3]-outG[((i-1)*sx+j)*3]+			      outR[((i+1)*sx+j)*3]-outG[((i+1)*sx+j)*3])/2;	CLIP(tmp,outR[(i*sx+j)*3]);      }      for (j=2;j<sx-1;j+=2) { // B-points	tmp=outG[(i*sx+j)*3]+(outR[((i-1)*sx+j-1)*3]-outG[((i-1)*sx+j-1)*3]+			      outR[((i-1)*sx+j+1)*3]-outG[((i-1)*sx+j+1)*3]+			      outR[((i+1)*sx+j-1)*3]-outG[((i+1)*sx+j-1)*3]+			      outR[((i+1)*sx+j+1)*3]-outG[((i+1)*sx+j+1)*3])/4;	CLIP(tmp,outR[(i*sx+j)*3]);      }    }          // process BLUE channel    for (i=0;i<sy;i+=2) {      for (j=1;j<sx-2;j+=2) {	tmp=outG[(i*sx+j)*3]+(outB[(i*sx+j-1)*3]-outG[(i*sx+j-1)*3]+			      outB[(i*sx+j+1)*3]-outG[(i*sx+j+1)*3])/2;	CLIP(tmp,outB[(i*sx+j)*3]);      }    }    for (i=1;i<sy-1;i+=2) {      for (j=0;j<sx-1;j+=2) {	tmp=outG[(i*sx+j)*3]+(outB[((i-1)*sx+j)*3]-outG[((i-1)*sx+j)*3]+			      outB[((i+1)*sx+j)*3]-outG[((i+1)*sx+j)*3])/2;	CLIP(tmp,outB[(i*sx+j)*3]);      }      for (j=1;j<sx-2;j+=2) {	tmp=outG[(i*sx+j)*3]+(outB[((i-1)*sx+j-1)*3]-outG[((i-1)*sx+j-1)*3]+			      outB[((i-1)*sx+j+1)*3]-outG[((i-1)*sx+j+1)*3]+			      outB[((i+1)*sx+j-1)*3]-outG[((i+1)*sx+j-1)*3]+			      outB[((i+1)*sx+j+1)*3]-outG[((i+1)*sx+j+1)*3])/4;	CLIP(tmp,outB[(i*sx+j)*3]);      }    }    break;  default: //---------------------------------------------------------    fprintf(stderr,"Bad Bayer pattern ID: %d\n",type);    return;    break;  }    ClearBorders(dest, sx, sy, 3);}voidClearBorders(unsigned char* dest, int sx, int sy, int w) {  int i,j;  // black edges:  i=3*sx*w-1;  j=3*sx*(sy-1)-1;  while (i>=0) {    dest[i--]=0;    dest[j--]=0;  }    i=sx*(sy-1)*3-1+w*3;  while (i>sx) {    j=6*w;    while (j>0) {      dest[i--]=0;      j--;    }    i-=(sx-2*w)*3;  }  }voidBayerDownsample(unsigned char *src, unsigned char *dest, int sx, int sy, int type){  unsigned char *outR=NULL, *outG=NULL, *outB=NULL;  register int i,j;  int tmp;  sx*=2;  sy*=2;  switch (type) {  case COLOR_FILTER_FORMAT7_GRBG:  case COLOR_FILTER_FORMAT7_BGGR:    outR=&dest[0];    outG=&dest[1];    outB=&dest[2];    break;  case COLOR_FILTER_FORMAT7_GBRG:  case COLOR_FILTER_FORMAT7_RGGB:    outR=&dest[2];    outG=&dest[1];    outB=&dest[0];    break;  default:    fprintf(stderr,"Bad Bayer pattern ID: %d\n",type);    return;    break;  }    switch (type) {  case COLOR_FILTER_FORMAT7_GRBG://---------------------------------------------------------  case COLOR_FILTER_FORMAT7_GBRG:    for (i=0;i<sy;i+=2) {      for (j=0;j<sx;j+=2) {	tmp=((src[i*sx+j]+src[(i+1)*sx+(j+1)])>>1);	CLIP(tmp,outG[(((i*sx)>>2)+(j>>1))*3]);	tmp=src[i*sx+j+1];	CLIP(tmp,outR[(((i*sx)>>2)+(j>>1))*3]);	tmp=src[(i+1)*sx+j];	CLIP(tmp,outB[(((i*sx)>>2)+(j>>1))*3]);      }    }    break;  case COLOR_FILTER_FORMAT7_BGGR://---------------------------------------------------------  case COLOR_FILTER_FORMAT7_RGGB:    for (i=0;i<sy;i+=2) {      for (j=0;j<sx;j+=2) {	tmp=((src[(i+1)*sx+j]+src[i*sx+(j+1)])>>1);	CLIP(tmp,outG[(((i*sx)>>2)+(j>>1))*3]);	tmp=src[(i+1)*sx+j+1];	CLIP(tmp,outR[(((i*sx)>>2)+(j>>1))*3]);	tmp=src[i*sx+j];	CLIP(tmp,outB[(((i*sx)>>2)+(j>>1))*3]);      }    }    break;  default: //---------------------------------------------------------    fprintf(stderr,"Bad Bayer pattern ID: %d\n",type);    return;    break;  }  }voidBayerSimple(unsigned char *src, unsigned char *dest, int sx, int sy, int type){  unsigned char *outR=NULL, *outG=NULL, *outB=NULL;  register int i,j;  int tmp, base;    switch (type) {  case COLOR_FILTER_FORMAT7_GRBG:  case COLOR_FILTER_FORMAT7_BGGR:    outR=&dest[0];    outG=&dest[1];    outB=&dest[2];    break;  case COLOR_FILTER_FORMAT7_GBRG:  case COLOR_FILTER_FORMAT7_RGGB:    outR=&dest[2];    outG=&dest[1];    outB=&dest[0];    break;  default:    fprintf(stderr,"Bad Bayer pattern ID: %d\n",type);    return;    break;  }    switch (type) {  case COLOR_FILTER_FORMAT7_GRBG://---------------------------------------------------------  case COLOR_FILTER_FORMAT7_GBRG:    for (i=0;i<sy-1;i+=2) {      for (j=0;j<sx-1;j+=2) {	base=i*sx+j;	tmp=((src[base]+src[base+sx+1])>>1);	CLIP(tmp,outG[base*3]);	tmp=src[base+1];	CLIP(tmp,outR[base*3]);	tmp=src[base+sx];	CLIP(tmp,outB[base*3]);      }    }    for (i=0;i<sy-1;i+=2) {      for (j=1;j<sx-1;j+=2) {	base=i*sx+j;	tmp=((src[base+1]+src[base+sx])>>1);	CLIP(tmp,outG[(base)*3]);	tmp=src[base];	CLIP(tmp,outR[(base)*3]);	tmp=src[base+1+sx];	CLIP(tmp,outB[(base)*3]);      }    }    for (i=1;i<sy-1;i+=2) {      for (j=0;j<sx-1;j+=2) {	base=i*sx+j;	tmp=((src[base+sx]+src[base+1])>>1);	CLIP(tmp,outG[base*3]);	tmp=src[base+sx+1];	CLIP(tmp,outR[base*3]);	tmp=src[base];	CLIP(tmp,outB[base*3]);      }    }    for (i=1;i<sy-1;i+=2) {      for (j=1;j<sx-1;j+=2) {	base=i*sx+j;	tmp=((src[base]+src[base+1+sx])>>1);	CLIP(tmp,outG[(base)*3]);	tmp=src[base+sx];	CLIP(tmp,outR[(base)*3]);	tmp=src[base+1];	CLIP(tmp,outB[(base)*3]);      }    }    break;  case COLOR_FILTER_FORMAT7_BGGR://---------------------------------------------------------  case COLOR_FILTER_FORMAT7_RGGB:    for (i=0;i<sy-1;i+=2) {      for (j=0;j<sx-1;j+=2) {	base=i*sx+j;	tmp=((src[base+sx]+src[base+1])>>1);	CLIP(tmp,outG[base*3]);	tmp=src[base+sx+1];	CLIP(tmp,outR[base*3]);	tmp=src[base];	CLIP(tmp,outB[base*3]);      }    }    for (i=1;i<sy-1;i+=2) {      for (j=0;j<sx-1;j+=2) {	base=i*sx+j;	tmp=((src[base]+src[base+1+sx])>>1);	CLIP(tmp,outG[(base)*3]);	tmp=src[base+1];	CLIP(tmp,outR[(base)*3]);	tmp=src[base+sx];	CLIP(tmp,outB[(base)*3]);      }    }    for (i=0;i<sy-1;i+=2) {      for (j=1;j<sx-1;j+=2) {	base=i*sx+j;	tmp=((src[base]+src[base+sx+1])>>1);	CLIP(tmp,outG[base*3]);	tmp=src[base+sx];	CLIP(tmp,outR[base*3]);	tmp=src[base+1];	CLIP(tmp,outB[base*3]);      }    }    for (i=1;i<sy-1;i+=2) {      for (j=1;j<sx-1;j+=2) {	base=i*sx+j;	tmp=((src[base+1]+src[base+sx])>>1);	CLIP(tmp,outG[(base)*3]);	tmp=src[base];	CLIP(tmp,outR[(base)*3]);	tmp=src[base+1+sx];	CLIP(tmp,outB[(base)*3]);      }    }    break;  default: //---------------------------------------------------------    fprintf(stderr,"Bad Bayer pattern ID: %d\n",type);    return;    break;  }   // add black border  for (i=sx*(sy-1)*3;i<sx*sy*3;i++) {    dest[i]=0;  }  for (i=(sx-1)*3;i<sx*sy*3;i+=(sx-1)*3) {    dest[i++]=0;    dest[i++]=0;    dest[i++]=0;  }}// change a 16bit stereo image (8bit/channel) into two 8bit images on top// of each othervoidStereoDecode(unsigned char *src, unsigned char *dest, unsigned long long int NumPixels){  register int i = NumPixels-1;  register int j = (NumPixels>>1)-1;  register int k = NumPixels-1;  while (i >= 0) {    dest[k--] = src[i--];    dest[j--] = src[i--];  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -