00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #if HAVE_CONFIG_H
00034 #include <config.h>
00035 #endif
00036 #include <tcl.h>
00037 #include <tk.h>
00038 #include <sadie.h>
00039 #include "tclsadie.h"
00040 #if WITH_DMALLOC
00041 #include <dmalloc.h>
00042 #endif
00043
00048 extern uint32_t nlev;
00049 extern uint32_t csize;
00050 extern double weight;
00051 extern double *count;
00052 extern PIXEL gmin;
00053 extern PIXEL gmax;
00054 extern PIXEL thresh;
00056
00061 static const char atitle[] = DEFAULT_TCL_ARRAY_TITLE;
00062 static const char ixaddr[] = DEFAULT_IN_IMAGE_ADDR_INDEX;
00063 static const char ixname[] = DEFAULT_OUT_IMAGE_NAME_INDEX;
00085 int
00086 Sadie_Filter_PSpectCmd (ClientData client_data, Tcl_Interp *interp,
00087 int objc, Tcl_Obj * const objv[])
00088 {
00089 IMAGE* inimg = NULL;
00090 IMAGE* outimg = NULL;
00091 int option;
00092
00093 if (objc != 2)
00094 {
00095 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00096 return TCL_ERROR;
00097 }
00098 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00099 != TCL_OK)
00100 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00101 != TCL_OK))
00102 return TCL_ERROR;
00103 if (option == NOR_PSPECT)
00104 PSPECT (inimg, &outimg);
00105 else
00106 PSPECT1D (inimg, (short)option, &outimg);
00107 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00108 }
00109
00129 int
00130 Sadie_Filter_FFTConvCmd (ClientData client_data, Tcl_Interp *interp,
00131 int objc, Tcl_Obj * const objv[])
00132 {
00133 IMAGE *inimg1 = NULL;
00134 IMAGE *inimg2 = NULL;
00135 IMAGE *outimg = NULL;
00136 int option;
00137
00138 if (objc != 2)
00139 {
00140 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00141 return TCL_ERROR;
00142 }
00143 if ((GetSadieImageFromObj2 (interp, objv[1], "inimg,addr1", &inimg1)
00144 != TCL_OK)
00145 || (GetSadieImageFromObj2 (interp, objv[1], "inimg,addr2", &inimg2)
00146 != TCL_OK)
00147 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00148 != TCL_OK))
00149 return TCL_ERROR;
00150 FCONVL (inimg1, inimg2, (short)option, &outimg);
00151 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00152 }
00153
00185 int
00186 Sadie_Filter_FFTFiltCmd (ClientData client_data, Tcl_Interp *interp,
00187 int objc, Tcl_Obj * const objv[])
00188 {
00189 IMAGE *inimg = NULL;
00190 IMAGE *outimg = NULL;
00191 int option;
00192 double xradius, yradius, parameter;
00193
00194 double (*flt) (double, double, double, double);
00195
00196 if (objc != 2)
00197 {
00198 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00199 return TCL_ERROR;
00200 }
00201 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00202 != TCL_OK)
00203 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00204 != TCL_OK)
00205 || (GetSadieDoubleFromObj2 (interp, objv[1], "xradius", &xradius)
00206 != TCL_OK)
00207 || (GetSadieDoubleFromObj2 (interp, objv[1], "yradius", &yradius)
00208 != TCL_OK)
00209 || (GetSadieDoubleFromObj2 (interp, objv[1], "parameter", ¶meter)
00210 != TCL_OK))
00211 return TCL_ERROR;
00212 switch (option)
00213 {
00214 case 1:
00215 flt = FLTCONE;
00216 break;
00217 case 2:
00218 flt = FLTEXP;
00219 break;
00220 case 3:
00221 flt = FLTGAUSS;
00222 break;
00223 case 4:
00224 flt = FLTBOX;
00225 break;
00226 default:
00227 flt = FLTCYL;
00228 break;
00229 }
00230 FILTER (inimg, flt, xradius, yradius, parameter, &outimg);
00231 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00232 }
00233
00250 int
00251 Sadie_Filter_FFTCmd (ClientData client_data, Tcl_Interp *interp,
00252 int objc, Tcl_Obj * const objv[])
00253 {
00254 IMAGE *inimg = NULL;
00255 IMAGE *outimg = NULL;
00256 int option;
00257
00258 if (objc != 2)
00259 {
00260 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00261 return TCL_ERROR;
00262 }
00263 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00264 != TCL_OK)
00265 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00266 != TCL_OK))
00267 return TCL_ERROR;
00268 FFT2D (inimg, (short)option, &outimg);
00269 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00270 }
00271
00288 int
00289 Sadie_Filter_FHTCmd (ClientData client_data, Tcl_Interp *interp,
00290 int objc, Tcl_Obj * const objv[])
00291 {
00292 IMAGE *inimg = NULL;
00293 IMAGE *outimg = NULL;
00294 int option;
00295
00296 if (objc != 2)
00297 {
00298 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00299 return TCL_ERROR;
00300 }
00301 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00302 != TCL_OK)
00303 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00304 != TCL_OK))
00305 return TCL_ERROR;
00306 FHT2D (inimg, (short)option, &outimg);
00307 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00308 }
00309
00330 int
00331 Sadie_Filter_MaskConvCmd (ClientData client_data, Tcl_Interp *interp,
00332 int objc, Tcl_Obj * const objv[])
00333 {
00334 uint32_t j, k;
00335 uint32_t lines, pix;
00336 size_t a;
00337 IMAGE *inimg = NULL;
00338 IMAGE *outimg = NULL;
00339 double factor, wt;
00340 PIXEL *psf = NULL;
00341 char index[SLEN];
00342
00343 if (objc != 2)
00344 {
00345 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00346 return TCL_ERROR;
00347 }
00348 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00349 != TCL_OK)
00350 || (GetSadieUintFromObj2 (interp, objv[1], "lines", &lines)
00351 != TCL_OK)
00352 || (GetSadieUintFromObj2 (interp, objv[1], "pix", &pix)
00353 != TCL_OK)
00354 || (GetSadieDoubleFromObj2 (interp, objv[1], "factor", &factor)
00355 != TCL_OK))
00356 return TCL_ERROR;
00357 psf = calloc (((size_t) lines * pix), sizeof(PIXEL));
00358 if (psf == NULL)
00359 {
00360 Tcl_SetStringObj (Tcl_GetObjResult (interp),
00361 "Cannot allocate memory!", -1);
00362 return TCL_ERROR;
00363 }
00364 for (a=0, j=0; j<lines; j++)
00365 {
00366 for (k=0; k<pix; k++)
00367 {
00368
00369 snprintf (index, SLEN - 1, "mask,%d,%d", j, k);
00370 if (GetSadieDoubleFromObj2 (interp, objv[1], (const char *) index,
00371 &wt) == TCL_OK)
00372 psf[a++] = (PIXEL) (wt / factor);
00373 else
00374 {
00375 free (psf);
00376 return TCL_ERROR;
00377 }
00378 }
00379 }
00380 SCONVL (inimg, psf, lines, pix, &outimg);
00381 free(psf);
00382 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00383 }
00384
00403 int
00404 Sadie_Filter_ImageConvCmd (ClientData client_data, Tcl_Interp *interp,
00405 int objc, Tcl_Obj * const objv[])
00406 {
00407 uint32_t j, k;
00408 size_t n, a, b, c;
00409 int normalize;
00410 uint32_t lines, pix;
00411 double factor;
00412 PIXEL pfactor;
00413 PIXEL *psf = NULL;
00414 IMAGE *inimg = NULL;
00415 IMAGE *kimg = NULL;
00416 IMAGE *outimg = NULL;
00417
00418 if (objc != 2)
00419 {
00420 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00421 return TCL_ERROR;
00422 }
00423 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00424 != TCL_OK)
00425 || (GetSadieImageFromObj2 (interp, objv[1], "kimg,addr", &kimg)
00426 != TCL_OK)
00427 || (GetSadieBooleanFromObj2 (interp, objv[1], "normalize", &normalize)
00428 != TCL_OK))
00429 return TCL_ERROR;
00430 lines = kimg->nlin;
00431 pix = kimg->npix;
00432 n = (size_t)lines * pix;
00433 psf = calloc (n, sizeof (PIXEL));
00434 if (psf == NULL)
00435 {
00436 Tcl_SetStringObj (Tcl_GetObjResult (interp),
00437 "Cannot allocate memory!", -1);
00438 return TCL_ERROR;
00439 }
00440 for (a=0, j=0; j<lines; j++)
00441 {
00442 for (k=0; k<pix; k++)
00443 psf[a++] = kimg->data[0][j][k];
00444 }
00445 if (normalize)
00446 {
00447 factor = 0.0;
00448 for (b = n; b != 0; factor += psf[--b]);
00449 pfactor = (PIXEL) factor;
00450 for (c = n; c != 0; psf[--c] /= pfactor);
00451 }
00452 SCONVL (inimg, psf, lines, pix, &outimg);
00453 free(psf);
00454 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00455 }
00456
00458 static const char *comp_label_index[2] = { "magname", "dirname" };
00459
00481 int
00482 Sadie_Filter_LibGradCmd (ClientData client_data, Tcl_Interp *interp,
00483 int objc, Tcl_Obj * const objv[])
00484 {
00485 IMAGE *inimg = NULL;
00486 IMAGE *comp_img[2] = { NULL, NULL };
00487 int option;
00488
00489 if (objc != 2)
00490 {
00491 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00492 return TCL_ERROR;
00493 }
00494 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00495 != TCL_OK)
00496 || (GetSadieIntFromObj2 (interp, objv[1], "option", &option)
00497 != TCL_OK))
00498 return TCL_ERROR;
00499 EDGE (inimg, (short)option, comp_img, comp_img + 1);
00500 return SetSadieComponentObj2 (interp, objv[1], comp_label_index, comp_img);
00501 }
00502
00504 #define GRADIENT_KERNEL_SIZE 3
00505
00506 static const short gradient_kernel_size = GRADIENT_KERNEL_SIZE;
00508 #define GRADIENT_KERNEL_AREA 9
00509
00530 int Sadie_Filter_MaskGradCmd (ClientData client_data, Tcl_Interp *interp,
00531 int objc, Tcl_Obj * const objv[])
00532 {
00533 int j, k, n;
00534 IMAGE *inimg = NULL;
00535 IMAGE *comp_img[2] = { NULL, NULL };
00536 PIXEL hpsf[GRADIENT_KERNEL_AREA], vpsf[GRADIENT_KERNEL_AREA];
00537 char index[SLEN];
00538 double hweight, vweight;
00539
00540 if (objc != 2)
00541 {
00542 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00543 return TCL_ERROR;
00544 }
00545 if (GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00546 != TCL_OK)
00547 return TCL_ERROR;
00548 for (n = 0, j = 0; j < gradient_kernel_size; j++)
00549 {
00550 for (k = 0; k < gradient_kernel_size; k++)
00551 {
00552
00553 snprintf (index, SLEN - 1, "hmask,%d,%d", j, k);
00554 if (GetSadieDoubleFromObj2 (interp, objv[1],
00555 (const char *) index, &hweight)
00556 != TCL_OK)
00557 return TCL_ERROR;
00558 hpsf[n] = (PIXEL) hweight;
00559
00560 snprintf(index, SLEN - 1, "vmask,%d,%d", j, k);
00561 if (GetSadieDoubleFromObj2 (interp, objv[1],
00562 (const char *) index, &vweight)
00563 != TCL_OK)
00564 return TCL_ERROR;
00565 vpsf[n++] = (PIXEL) vweight;
00566 }
00567 }
00568 GRADIENT (inimg, vpsf, hpsf, gradient_kernel_size, comp_img, comp_img + 1);
00569 return SetSadieComponentObj2 (interp, objv[1], comp_label_index, comp_img);
00570 }
00571
00592 int
00593 Sadie_Filter_ImageGradCmd (ClientData client_data, Tcl_Interp *interp,
00594 int objc, Tcl_Obj * const objv[])
00595 {
00596 uint32_t lines, pix, j, k;
00597 size_t n, a;
00598 short ssize;
00599 PIXEL *hpsf = NULL;
00600 PIXEL *vpsf = NULL;
00601 IMAGE *inimg = NULL;
00602 IMAGE *himg = NULL;
00603 IMAGE *vimg = NULL;
00604 IMAGE *comp_img[2] = { NULL, NULL };
00605
00606 if (objc != 2)
00607 {
00608 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00609 return TCL_ERROR;
00610 }
00611 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00612 != TCL_OK)
00613 || (GetSadieImageFromObj2 (interp, objv[1], "himg,addr", &himg)
00614 != TCL_OK)
00615 || (GetSadieImageFromObj2 (interp, objv[1], "vimg,addr", &vimg)
00616 != TCL_OK))
00617 return TCL_ERROR;
00618 if ((himg->nlin != himg->npix) || (himg->nlin != vimg->nlin)
00619 || (himg->nlin != vimg->npix))
00620 {
00621 Tcl_SetStringObj (Tcl_GetObjResult (interp),
00622 "Image kernels must be square and equal in size.", -1);
00623 return TCL_ERROR;
00624 }
00625 lines = himg->nlin;
00626 pix = himg->npix;
00627 n = (size_t)lines * pix;
00628 ssize = (short) n;
00629 if ((size_t) ssize != n)
00630 {
00631 Tcl_SetStringObj (Tcl_GetObjResult (interp),
00632 "Image kernels too large for the SADIE GRADIENT function.", -1);
00633 return TCL_ERROR;
00634 }
00635 hpsf = calloc (n, sizeof (PIXEL));
00636 if (hpsf == NULL)
00637 {
00638 Tcl_SetStringObj (Tcl_GetObjResult (interp),
00639 "Cannot allocate memory!", -1);
00640 return TCL_ERROR;
00641 }
00642 vpsf = calloc (n, sizeof (PIXEL));
00643 if (vpsf == NULL)
00644 {
00645 Tcl_SetStringObj (Tcl_GetObjResult (interp),
00646 "Cannot allocate memory!", -1);
00647 free (hpsf);
00648 return TCL_ERROR;
00649 }
00650 for (a = 0, j = 0; j < lines; j++)
00651 {
00652 for (k = 0; k < pix; k++)
00653 {
00654 hpsf[a] = himg->data[0][j][k];
00655 vpsf[a++] = vimg->data[0][j][k];
00656 }
00657 }
00658 GRADIENT(inimg, vpsf, hpsf, ssize, comp_img, comp_img + 1);
00659 free (vpsf);
00660 free (hpsf);
00661 return SetSadieComponentObj2 (interp, objv[1], comp_label_index, comp_img);
00662 }
00663
00685 static int
00686 apply_sadie_window (Tcl_Interp *interp, int objc, Tcl_Obj * const objv[],
00687 PIXEL (*wtf)(PIXEL *, uint32_t, uint32_t))
00688 {
00689 IMAGE *inimg = NULL;
00690 IMAGE *outimg = NULL;
00691 uint32_t lines, pix;
00692
00693 if (objc != 2)
00694 {
00695 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00696 return TCL_ERROR;
00697 }
00698 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00699 != TCL_OK)
00700 || (GetSadieUintFromObj2 (interp, objv[1], "lines", &lines)
00701 != TCL_OK)
00702 || (GetSadieUintFromObj2 (interp, objv[1], "pix", &pix)
00703 != TCL_OK))
00704 return TCL_ERROR;
00705 WINDOW (inimg, wtf, lines, pix, &outimg);
00706 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00707 }
00708
00721 int
00722 Sadie_Filter_VarMapCmd (ClientData client_data, Tcl_Interp *interp,
00723 int objc, Tcl_Obj * const objv[])
00724 {
00725 return apply_sadie_window (interp, objc, objv, WTFVAR);
00726 }
00727
00741 int
00742 Sadie_Filter_MinFiltCmd (ClientData client_data, Tcl_Interp *interp,
00743 int objc, Tcl_Obj * const objv[])
00744 {
00745 return apply_sadie_window (interp, objc, objv, WTFMIN);
00746 }
00747
00761 int
00762 Sadie_Filter_MaxFiltCmd (ClientData client_data, Tcl_Interp *interp,
00763 int objc, Tcl_Obj * const objv[])
00764 {
00765 return apply_sadie_window (interp, objc, objv, WTFMAX);
00766 }
00767
00780 int
00781 Sadie_Filter_DivMapCmd (ClientData client_data, Tcl_Interp *interp,
00782 int objc, Tcl_Obj * const objv[])
00783 {
00784 return apply_sadie_window (interp, objc, objv, WTFDIVER);
00785 }
00786
00811 int
00812 Sadie_Filter_MajFiltCmd (ClientData client_data, Tcl_Interp *interp,
00813 int objc, Tcl_Obj * const objv[])
00814 {
00815 IMAGE *inimg = NULL;
00816 IMAGE *outimg = NULL;
00817 uint32_t lines, pix;
00818
00819 if (objc != 2)
00820 {
00821 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00822 return TCL_ERROR;
00823 }
00824 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00825 != TCL_OK)
00826 || (GetSadieUintFromObj2 (interp, objv[1], "lines", &lines)
00827 != TCL_OK)
00828 || (GetSadieUintFromObj2 (interp, objv[1], "pix", &pix)
00829 != TCL_OK)
00830 || (GetSadieDoubleFromObj2 (interp, objv[1], "weight", &weight)
00831 != TCL_OK))
00832 return TCL_ERROR;
00833 RANGE (inimg);
00834 nlev = (uint32_t)inimg->gmax - (uint32_t)inimg->gmin + 1;
00835 gmin = inimg->gmin;
00836 gmax = inimg->gmax;
00837 count = NULL;
00838 count = calloc ((size_t) nlev , sizeof (double));
00839 if (count == NULL)
00840 {
00841 Tcl_SetStringObj (Tcl_GetObjResult (interp),
00842 "Cannot allocate memory!", -1);
00843 return TCL_ERROR;
00844 }
00845 WINDOW (inimg, WTFMAJ, lines, pix, &outimg);
00846 free(count);
00847 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00848 }
00849
00866 int
00867 Sadie_Filter_MedFiltCmd (ClientData client_data, Tcl_Interp *interp,
00868 int objc, Tcl_Obj * const objv[])
00869 {
00870 IMAGE *inimg = NULL;
00871 IMAGE *outimg = NULL;
00872 uint32_t lines, pix;
00873
00874 if (objc != 2)
00875 {
00876 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00877 return TCL_ERROR;
00878 }
00879 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00880 != TCL_OK)
00881 || (GetSadieUintFromObj2 (interp, objv[1], "lines", &lines)
00882 != TCL_OK)
00883 || (GetSadieUintFromObj2 (interp, objv[1], "pix", &pix)
00884 != TCL_OK))
00885 return TCL_ERROR;
00886 MEDIAN (inimg, lines, pix, &outimg);
00887 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00888 }
00889
00922 int
00923 Sadie_Filter_CAvgFiltCmd (ClientData client_data, Tcl_Interp *interp,
00924 int objc, Tcl_Obj * const objv[])
00925 {
00926 IMAGE *inimg = NULL;
00927 IMAGE *outimg = NULL;
00928 uint32_t lines, pix;
00929
00930 if (objc != 2)
00931 {
00932 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00933 return TCL_ERROR;
00934 }
00935 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00936 != TCL_OK)
00937 || (GetSadieUintFromObj2 (interp, objv[1], "lines", &lines)
00938 != TCL_OK)
00939 || (GetSadieUintFromObj2 (interp, objv[1], "pix", &pix)
00940 != TCL_OK)
00941 || (GetSadieUintFromObj2 (interp, objv[1], "size", &csize)
00942 != TCL_OK)
00943 || (GetSadiePixelFromObj2 (interp, objv[1], "thresh", &thresh)
00944 != TCL_OK))
00945 return TCL_ERROR;
00946 WINDOW (inimg, WTFCAVG, lines, pix, &outimg);
00947 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00948 }
00949
00956 int
00957 Sadie_Filter_Init (Tcl_Interp *interp)
00958 {
00959 Tcl_CreateObjCommand (interp, "Sadie_Filter_PSpect",
00960 Sadie_Filter_PSpectCmd, NULL, NULL);
00961 Tcl_CreateObjCommand (interp, "Sadie_Filter_FFTConv",
00962 Sadie_Filter_FFTConvCmd, NULL, NULL);
00963 Tcl_CreateObjCommand (interp, "Sadie_Filter_FFTFilt",
00964 Sadie_Filter_FFTFiltCmd, NULL, NULL);
00965 Tcl_CreateObjCommand (interp, "Sadie_Filter_FFT",
00966 Sadie_Filter_FFTCmd, NULL, NULL);
00967 Tcl_CreateObjCommand (interp, "Sadie_Filter_FHT",
00968 Sadie_Filter_FHTCmd, NULL, NULL);
00969 Tcl_CreateObjCommand (interp, "Sadie_Filter_MaskConv",
00970 Sadie_Filter_MaskConvCmd, NULL, NULL);
00971 Tcl_CreateObjCommand (interp, "Sadie_Filter_ImageConv",
00972 Sadie_Filter_ImageConvCmd, NULL, NULL);
00973 Tcl_CreateObjCommand (interp, "Sadie_Filter_LibGrad",
00974 Sadie_Filter_LibGradCmd, NULL, NULL);
00975 Tcl_CreateObjCommand (interp, "Sadie_Filter_ImageGrad",
00976 Sadie_Filter_ImageGradCmd, NULL, NULL);
00977 Tcl_CreateObjCommand (interp, "Sadie_Filter_MaskGrad",
00978 Sadie_Filter_MaskGradCmd, NULL, NULL);
00979 Tcl_CreateObjCommand (interp, "Sadie_Filter_VarMap",
00980 Sadie_Filter_VarMapCmd, NULL, NULL);
00981 Tcl_CreateObjCommand (interp, "Sadie_Filter_DivMap",
00982 Sadie_Filter_DivMapCmd, NULL, NULL);
00983 Tcl_CreateObjCommand (interp, "Sadie_Filter_MajFilt",
00984 Sadie_Filter_MajFiltCmd, NULL, NULL);
00985 Tcl_CreateObjCommand (interp, "Sadie_Filter_MedFilt",
00986 Sadie_Filter_MedFiltCmd, NULL, NULL);
00987 Tcl_CreateObjCommand (interp, "Sadie_Filter_MinFilt",
00988 Sadie_Filter_MinFiltCmd, NULL, NULL);
00989 Tcl_CreateObjCommand (interp, "Sadie_Filter_MaxFilt",
00990 Sadie_Filter_MaxFiltCmd, NULL, NULL);
00991 Tcl_CreateObjCommand (interp, "Sadie_Filter_CAvgFilt",
00992 Sadie_Filter_CAvgFiltCmd, NULL, NULL);
00993 return TCL_OK;
00994 }
00995