Main Page   Data Structures   File List   Data Fields   Globals  

findgainadj.c

Go to the documentation of this file.
00001 #include        "sadie.h"
00002 #include        "proto.h"
00003 
00004 
00005 
00006 /*-General Information--------------------------------------------------------*/
00007 /*                                                                            */
00008 /*   This function is based on stats.c from the SADIE library.  It takes two  */
00009 /*   overlapping images and calculates necessary gain adjustments between the */
00010 /*   two images.                                                              */
00011 /*                                                                            */
00012 /*----------------------------------------------------------------------------*/
00013 /*-Interface Information------------------------------------------------------*/
00014 void FINDGAINADJ (
00015 IMAGE  *imga,     /*  Pointer to the first input image.                       */
00016 IMAGE  *imgb,     /*  Pointer to the second input image.                      */
00017 int    xoffset,   /*  x-offset of second image                                */
00018 int    yoffset,   /*  y-offset of second image                                */
00019 PIXEL  *gain,     /*  Gain adjustment of second input image relative to       */
00020                   /*    the first input image                                 */
00021 PIXEL  *bias      /*  Bias adjustment of second input image relative to       */
00022                   /*    the first input image                                 */
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     /* check input */
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     /* compute the overlap regions of each image */
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     /* compute the mean and deviation statistics for the overlap regions of each image */
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 

Generated on Wed Apr 9 08:56:05 2003 for TREES by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002