00001 #include "sadie.h"
00002 #include "proto.h"
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 void FINDGAINADJ (
00015 IMAGE *imga,
00016 IMAGE *imgb,
00017 int xoffset,
00018 int yoffset,
00019 PIXEL *gain,
00020
00021 PIXEL *bias
00022
00023
00024 ) { register int i, j, k;
00025 char msg[SLEN];
00026 long *hist=0, maxval, npts;
00027 double sum, sumsq;
00028 int leftlimita, rightlimita, toplimita, bottomlimita;
00029 int leftlimitb, rightlimitb, toplimitb, bottomlimitb;
00030 int overlapwidth, overlapheight;
00031 double gmina, gmaxa, meana, deva;
00032 double gminb, gmaxb, meanb, devb;
00033
00034
00035
00036 if (!CHECKIMG(imga)) {
00037 MESSAGE('E'," Can't identify image A.");
00038 goto the_end;
00039 } else if (!CHECKIMG(imgb)) {
00040 MESSAGE('E'," Can't identify image B.");
00041 goto the_end;
00042 }
00043
00044
00045
00046 if (xoffset >= 0) {
00047 leftlimita = min(xoffset,imga->npix-1);
00048 rightlimita = min(imga->npix-1,(imgb->npix-1)+leftlimita);
00049
00050 leftlimitb = 0;
00051 rightlimitb = min(imgb->npix-1,(imga->npix-1)-xoffset);
00052 } else {
00053 leftlimita = 0;
00054 rightlimita = min(imga->npix-1,(imgb->npix-1) + xoffset);
00055
00056 leftlimitb = min(imgb->npix-1, 0-xoffset);
00057 rightlimitb = min(imgb->npix-1, (imga->npix-1) - xoffset);
00058 }
00059
00060 if (yoffset >= 0) {
00061 toplimita = min(yoffset,imga->nlin-1);
00062 bottomlimita = min(imga->nlin-1,(imgb->nlin-1)+toplimita);
00063
00064 toplimitb = 0;
00065 bottomlimitb = min(imgb->nlin-1, (imga->nlin-1)-yoffset);
00066 } else {
00067 toplimita = 0;
00068 bottomlimita = min(imga->nlin-1,(imgb->nlin-1) + yoffset);
00069
00070 toplimitb = min(imgb->nlin-1, 0-yoffset);
00071 bottomlimitb = min(imgb->nlin-1, (imga->nlin-1) - yoffset);
00072 }
00073
00074 overlapheight = (bottomlimita - toplimita) + 1;
00075 overlapwidth = (rightlimita - leftlimita) + 1;
00076
00077
00078 gmina = imga->data[0][toplimita][leftlimita];
00079 gmaxa = imga->data[0][toplimita][leftlimita];
00080 for (sum=sumsq=0.0,j=toplimita; j<=bottomlimita; j+=1) {
00081 for (k=leftlimita; k<=rightlimita; k+=1) {
00082 sum += (double)imga->data[0][j][k];
00083 sumsq += (double)(imga->data[0][j][k]*imga->data[0][j][k]);
00084 gmina = min(gmina,imga->data[0][j][k]);
00085 gmaxa = max(gmaxa,imga->data[0][j][k]);
00086 }
00087 }
00088 meana = sum/((double)(overlapheight+(overlapheight%1 ? 1:0))*(double)(overlapwidth+(overlapwidth%1 ? 1:0)));
00089 deva = sqrt(sumsq/((double)(overlapheight+(overlapheight%1 ? 1:0))*(double)(overlapwidth+(overlapwidth%1 ? 1:0)))-meana*meana);
00090
00091 gminb = imgb->data[0][toplimitb][leftlimitb];
00092 gmaxb = imgb->data[0][toplimitb][leftlimitb];
00093 for (sum=sumsq=0.0,j=toplimitb; j<=bottomlimitb; j+=1) {
00094 for (k=leftlimitb; k<=rightlimitb; k+=1) {
00095 sum += (double)imgb->data[0][j][k];
00096 sumsq += (double)(imgb->data[0][j][k]*imgb->data[0][j][k]);
00097 gminb = min(gminb,imgb->data[0][j][k]);
00098 gmaxb = max(gmaxb,imgb->data[0][j][k]);
00099 }
00100 }
00101 meanb = sum/((double)(overlapheight+(overlapheight%1 ? 1:0))*(double)(overlapwidth+(overlapwidth%1 ? 1:0)));
00102 devb = sqrt(sumsq/((double)(overlapheight+(overlapheight%1 ? 1:0))*(double)(overlapwidth+(overlapwidth%1 ? 1:0)))-meanb*meanb);
00103
00104 *gain = (PIXEL) (deva/devb);
00105 *bias = (PIXEL) (meana - (*gain * meanb));
00106
00107
00108
00109 MESSAGE('I',"");
00110 MESSAGE('I',"----------");
00111 MESSAGE('I',"");
00112 MESSAGE('I',"FINDGAINADJ");
00113 MESSAGE('I',"");
00114 sprintf(msg," Input image #1: %s",imga->text);
00115 MESSAGE('I',msg);
00116 MESSAGE('I'," Minimum Maximum Mean Deviation ");
00117 sprintf(msg,"%12.4e%12.4e%12.4e%12.4e",(double)gmina,(double)gmaxa,meana,deva);
00118 MESSAGE('I',msg);
00119 sprintf(msg," Overlap Region: (%d,%d) to (%d,%d)",leftlimita+1,toplimita+1,rightlimita+1,bottomlimita+1);
00120 MESSAGE('I',msg);
00121 MESSAGE('I',"");
00122 sprintf(msg," Input image #2: %s",imgb->text);
00123 MESSAGE('I',msg);
00124 MESSAGE('I'," Minimum Maximum Mean Deviation ");
00125 sprintf(msg,"%12.4e%12.4e%12.4e%12.4e",(double)gminb,(double)gmaxb,meanb,devb);
00126 MESSAGE('I',msg);
00127 sprintf(msg," Overlap Region: (%d,%d) to (%d,%d)",leftlimitb+1,toplimitb+1,rightlimitb+1,bottomlimitb+1);
00128 MESSAGE('I',msg);
00129 MESSAGE('I',"");
00130 sprintf(msg," Gain Adjustment: %12.4e , Bias Adjustment: %12.4e",*gain,*bias);
00131 MESSAGE('I',msg);
00132 MESSAGE('I',"");
00133 MESSAGE('I'," ...............");
00134
00135 the_end:
00136 MESSAGE('I',"");
00137 }
00138