00001 #include "sadie.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 void
00017 SCATTER (IMAGE * in1,
00018 IMAGE * in2,
00019 short bnd1,
00020 short bnd2,
00021 short inc,
00022 short nlev,
00023
00024 IMAGE ** out
00025
00026 )
00027 {
00028 register short i, j, ix, iy;
00029 char msg[SLEN];
00030 double width, pinc, psum;
00031 PIXEL gmin, gmax;
00032
00033 if (TIMES)
00034 TIMING (T_SCATTER);
00035 if (NAMES)
00036 {
00037 MESSAGE ('I', "");
00038 MESSAGE ('I', "SCATTER");
00039 MESSAGE ('I', "");
00040 sprintf (msg, " First input image: %s - band %d",
00041 in1->text, bnd1 + 1);
00042 MESSAGE ('I', msg);
00043 sprintf (msg, " Second input image: %s - band %d",
00044 in2->text, bnd2 + 1);
00045 MESSAGE ('I', msg);
00046 sprintf (msg, " Histogram resolution: %d", nlev);
00047 MESSAGE ('I', msg);
00048 sprintf (msg, " Line and pixel subsample increment: %d", inc);
00049 MESSAGE ('I', msg);
00050 MESSAGE ('I', " ...............");
00051 }
00052
00053
00054 if (!CHECKIMG (in1))
00055 {
00056 MESSAGE ('E', " Can't identify first image.");
00057 goto the_end;
00058 }
00059 else if (!CHECKIMG (in2))
00060 {
00061 MESSAGE ('E', " Can't identify second image.");
00062 goto the_end;
00063 }
00064 else if (0 > bnd1 || bnd1 >= in1->nbnd)
00065 {
00066 MESSAGE ('E', " Can't identify first band.");
00067 goto the_end;
00068 }
00069 else if (0 > bnd2 || bnd2 >= in2->nbnd)
00070 {
00071 MESSAGE ('E', " Can't identify second band.");
00072 goto the_end;
00073 }
00074 else if (in1->nlin != in2->nlin)
00075 {
00076 MESSAGE ('E', " Number of lines must be identical in both images.");
00077 goto the_end;
00078 }
00079 else if (in1->npix != in2->npix)
00080 {
00081 MESSAGE ('E',
00082 " Number of pixels/line must be identical in both images.");
00083 goto the_end;
00084 }
00085 else if (inc <= 0)
00086 {
00087 MESSAGE ('E', " Subsample increment must be greater than zero.");
00088 goto the_end;
00089 }
00090 else if (nlev <= 0)
00091 {
00092 MESSAGE ('E', " Number of histogram bins must be greater than zero.");
00093 goto the_end;
00094 }
00095
00096
00097 if (!CHECKIMG (*out))
00098 GETMEM (1, nlev, nlev, out);
00099 if (!*out)
00100 goto the_end;
00101
00102
00103 if (LINES && !PROGRESS (psum = 0.0))
00104 goto the_end;
00105 pinc = 1.0 / (double) (in1->nlin / inc + (in1->nlin % inc ? 1 : 0));
00106
00107
00108 RANGE (in1);
00109 RANGE (in2);
00110 gmin = min (in1->gmin, in2->gmin);
00111 gmax = max (in1->gmax, in2->gmax);
00112 width = (double) (gmax - gmin) / (double) (nlev - 1);
00113
00114
00115 for (i = 0; i < nlev; i++)
00116 {
00117 for (j = 0; j < nlev; j++)
00118 {
00119 (*out)->data[0][i][j] = (PIXEL) 0;
00120 }
00121 }
00122
00123
00124 for (i = 0; i < in1->nlin; i += inc)
00125 {
00126 for (j = 0; j < in1->npix; j += inc)
00127 {
00128 ix = (short) ((double) (in1->data[bnd1][i][j] - gmin) / width);
00129 iy = (short) ((double) (in2->data[bnd2][i][j] - gmin) / width);
00130 (*out)->data[0][ix][iy] += (PIXEL) 1;
00131 }
00132 if (LINES && !PROGRESS (psum += pinc))
00133 goto the_end;
00134 }
00135
00136 the_end:
00137 if (TIMES)
00138 TIMING (T_EXIT);
00139 }