00001
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #if HAVE_CONFIG_H
00032 #include <config.h>
00033 #endif
00034 #include <tcl.h>
00035 #include <tk.h>
00036 #include <sadie.h>
00037 #include "tclsadie.h"
00038 #if WITH_DMALLOC
00039 #include <dmalloc.h>
00040 #endif
00041
00046 extern uint32_t nlev;
00047 extern PIXEL gain;
00048 extern PIXEL bias;
00049 extern PIXEL gmin;
00050 extern PIXEL gmax;
00051 extern PIXEL thresh;
00052 extern PIXEL gbrk[2][4];
00053 extern PIXEL *table;
00055
00060 static const char atitle[] = DEFAULT_TCL_ARRAY_TITLE;
00061 static const char ixaddr[] = DEFAULT_IN_IMAGE_ADDR_INDEX;
00062 static const char ixname[] = DEFAULT_OUT_IMAGE_NAME_INDEX;
00083 int
00084 Sadie_Contrast_NormStretchCmd (ClientData client_data, Tcl_Interp *interp,
00085 int objc, Tcl_Obj * const objv[])
00086 {
00087 IMAGE *inimg = NULL;
00088 IMAGE *outimg = NULL;
00089 uint32_t incr;
00090 double sigma;
00091 PIXEL mean;
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 || (GetSadieUintFromObj2 (interp, objv[1], "incr", &incr)
00101 != TCL_OK)
00102 || (GetSadieDoubleFromObj2 (interp, objv[1], "sigma", &sigma)
00103 != TCL_OK)
00104 || (GetSadiePixelFromObj2 (interp, objv[1], "mean", &mean)
00105 != TCL_OK))
00106 return TCL_ERROR;
00107 CONTNORM (inimg, mean, sigma, incr, &outimg);
00108 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00109 }
00110
00129 int
00130 Sadie_Contrast_HisteqStretchCmd (ClientData client_data, Tcl_Interp *interp,
00131 int objc, Tcl_Obj * const objv[])
00132 {
00133 IMAGE *inimg = NULL;
00134 IMAGE *outimg = NULL;
00135 uint32_t res, incr;
00136
00137 if (objc != 2)
00138 {
00139 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00140 return TCL_ERROR;
00141 }
00142 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00143 != TCL_OK)
00144 || (GetSadieUintFromObj2 (interp, objv[1], "res", &res)
00145 != TCL_OK)
00146 || (GetSadieUintFromObj2 (interp, objv[1], "incr", &incr)
00147 != TCL_OK))
00148 return TCL_ERROR;
00149 HISTEQ (inimg, res, incr, &outimg);
00150 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00151 }
00152
00172 int
00173 Sadie_Contrast_LinearStretchCmd (ClientData client_data, Tcl_Interp *interp,
00174 int objc, Tcl_Obj * const objv[])
00175 {
00176 IMAGE *inimg = NULL;
00177 IMAGE *outimg = NULL;
00178 double minorbias, maxorgain;
00179 int type;
00180
00181 if (objc != 2)
00182 {
00183 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00184 return TCL_ERROR;
00185 }
00186 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00187 != TCL_OK)
00188 || (GetSadieDoubleFromObj2 (interp, objv[1], "minorbias", &minorbias)
00189 != TCL_OK)
00190 || (GetSadieDoubleFromObj2 (interp, objv[1], "maxorgain", &maxorgain)
00191 != TCL_OK)
00192 || (GetSadieIntFromObj2 (interp, objv[1], "type", &type)
00193 != TCL_OK))
00194 return TCL_ERROR;
00195 if (type == 0)
00196 {
00197 gmin = (PIXEL) minorbias;
00198 gmax = (PIXEL) maxorgain;
00199 STRETCH (inimg, TFSCALE, &outimg);
00200 }
00201 else
00202 {
00203 bias = (PIXEL) minorbias;
00204 gain = (PIXEL) maxorgain;
00205 STRETCH (inimg, TFLINEAR, &outimg);
00206 }
00207 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00208 }
00209
00225 int
00226 Sadie_Contrast_LogStretchCmd (ClientData client_data, Tcl_Interp *interp,
00227 int objc, Tcl_Obj * const objv[])
00228 {
00229 IMAGE *inimg = NULL;
00230 IMAGE *outimg = NULL;
00231
00232 if (objc != 2)
00233 {
00234 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00235 return TCL_ERROR;
00236 }
00237 if (GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00238 != TCL_OK)
00239 return TCL_ERROR;
00240 STRETCH (inimg, TFLOG, &outimg);
00241 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00242 }
00243
00269 int
00270 Sadie_Contrast_PWLStretchCmd (ClientData client_data, Tcl_Interp *interp,
00271 int objc, Tcl_Obj * const objv[])
00272 {
00273 IMAGE *inimg = NULL;
00274 IMAGE *outimg = NULL;
00275
00276 if (objc != 2)
00277 {
00278 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00279 return TCL_ERROR;
00280 }
00281 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00282 != TCL_OK)
00283 || (GetSadiePixelFromObj2 (interp, objv[1], "in1", gbrk[0])
00284 != TCL_OK)
00285 || (GetSadiePixelFromObj2 (interp, objv[1], "in2", gbrk[0] + 1)
00286 != TCL_OK)
00287 || (GetSadiePixelFromObj2 (interp, objv[1], "in3", gbrk[0] + 2)
00288 != TCL_OK)
00289 || (GetSadiePixelFromObj2 (interp, objv[1], "in4", gbrk[0] + 3)
00290 != TCL_OK)
00291 || (GetSadiePixelFromObj2 (interp, objv[1], "out1", gbrk[1])
00292 != TCL_OK)
00293 || (GetSadiePixelFromObj2 (interp, objv[1], "out2", gbrk[1] + 1)
00294 != TCL_OK)
00295 || (GetSadiePixelFromObj2 (interp, objv[1], "out3", gbrk[1] + 2)
00296 != TCL_OK)
00297 || (GetSadiePixelFromObj2 (interp, objv[1], "out4", gbrk[1] + 3)
00298 != TCL_OK))
00299 return TCL_ERROR;
00300 STRETCH (inimg, TFPLT, &outimg);
00301 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00302 }
00303
00304
00320 int
00321 Sadie_Contrast_RootStretchCmd (ClientData client_data, Tcl_Interp *interp,
00322 int objc, Tcl_Obj * const objv[])
00323 {
00324 IMAGE *inimg = NULL;
00325 IMAGE *outimg = NULL;
00326
00327 if (objc != 2)
00328 {
00329 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00330 return TCL_ERROR;
00331 }
00332 if (GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00333 != TCL_OK)
00334 return TCL_ERROR;
00335 STRETCH (inimg, TFROOT, &outimg);
00336 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00337 }
00338
00353 int
00354 Sadie_Contrast_SqrStretchCmd (ClientData client_data, Tcl_Interp *interp,
00355 int objc, Tcl_Obj * const objv[])
00356 {
00357 IMAGE *inimg = NULL;
00358 IMAGE *outimg = NULL;
00359
00360 if (objc != 2)
00361 {
00362 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00363 return TCL_ERROR;
00364 }
00365 if (GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00366 != TCL_OK)
00367 return TCL_ERROR;
00368 STRETCH (inimg, TFSQUARE, &outimg);
00369 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00370 }
00371
00390 int
00391 Sadie_Contrast_TblStretchCmd (ClientData client_data, Tcl_Interp *interp,
00392 int objc, Tcl_Obj * const objv[])
00393 {
00394 uint32_t i;
00395 IMAGE *inimg = NULL;
00396 IMAGE *outimg = NULL;
00397 char index[SLEN];
00398
00399 if (objc != 2)
00400 {
00401 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00402 return TCL_ERROR;
00403 }
00404 if (GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00405 != TCL_OK)
00406 return TCL_ERROR;
00407 nlev = (uint32_t)floor(inimg->gmax) - (uint32_t)floor(inimg->gmin) + 1;
00408 table = calloc (nlev, sizeof(PIXEL));
00409 if (table == NULL)
00410 return TCL_ERROR;
00411 for (i = 0; i < nlev; i++)
00412 {
00413
00414 snprintf(index, SLEN - 1, "index,%u", i);
00415 if (GetSadiePixelFromObj2 (interp, objv[1], (const char *) index,
00416 table + i) != TCL_OK)
00417 {
00418 free (table);
00419 return TCL_ERROR;
00420 }
00421 }
00422 STRETCH (inimg, TFTABLE, &outimg);
00423 free (table);
00424 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00425 }
00426
00446 int
00447 Sadie_Contrast_QntStretchCmd (ClientData client_data, Tcl_Interp *interp,
00448 int objc, Tcl_Obj * const objv[])
00449 {
00450 IMAGE *inimg = NULL;
00451 IMAGE *outimg = NULL;
00452
00453 if (objc != 2)
00454 {
00455 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00456 return TCL_ERROR;
00457 }
00458 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00459 != TCL_OK)
00460 || (GetSadieUintFromObj2 (interp, objv[1], "steps", &nlev)
00461 != TCL_OK)
00462 || (GetSadiePixelFromObj2 (interp, objv[1], "gmax", &gmax)
00463 != TCL_OK)
00464 || (GetSadiePixelFromObj2 (interp, objv[1], "gmin", &gmin)
00465 != TCL_OK))
00466 return TCL_ERROR;
00467 STRETCH (inimg, TFQUANT, &outimg);
00468 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00469 }
00470
00488 int
00489 Sadie_Contrast_SatStretchCmd (ClientData client_data, Tcl_Interp *interp,
00490 int objc, Tcl_Obj * const objv[])
00491 {
00492 IMAGE *inimg = NULL;
00493 IMAGE *outimg = NULL;
00494
00495 if (objc != 2)
00496 {
00497 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00498 return TCL_ERROR;
00499 }
00500 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00501 != TCL_OK)
00502 || (GetSadiePixelFromObj2 (interp, objv[1], "gmax", &gmax)
00503 != TCL_OK)
00504 || (GetSadiePixelFromObj2 (interp, objv[1], "gmin", &gmin)
00505 != TCL_OK))
00506 return TCL_ERROR;
00507 STRETCH (inimg, TFSAT, &outimg);
00508 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00509 }
00510
00527 int
00528 Sadie_Contrast_ThreshStretchCmd (ClientData client_data, Tcl_Interp *interp,
00529 int objc, Tcl_Obj * const objv[])
00530 {
00531 IMAGE *inimg = NULL;
00532 IMAGE *outimg = NULL;
00533
00534 if (objc != 2)
00535 {
00536 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00537 return TCL_ERROR;
00538 }
00539 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00540 != TCL_OK)
00541 || (GetSadiePixelFromObj2 (interp, objv[1], "thresh", &thresh)
00542 != TCL_OK))
00543 return TCL_ERROR;
00544 STRETCH (inimg, TFTHRESH, &outimg);
00545 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00546 }
00547
00565 int
00566 Sadie_Contrast_AdaptStretchCmd (ClientData client_data, Tcl_Interp *interp,
00567 int objc, Tcl_Obj * const objv[])
00568 {
00569 IMAGE *inimg = NULL;
00570 IMAGE *outimg = NULL;
00571 uint32_t blocksize;
00572
00573 if (objc != 2)
00574 {
00575 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00576 return TCL_ERROR;
00577 }
00578 if ((GetSadieImageFromObj2 (interp, objv[1], ixaddr, &inimg)
00579 != TCL_OK)
00580 || (GetSadieUintFromObj2 (interp, objv[1], "blocksize", &blocksize)
00581 != TCL_OK))
00582 return TCL_ERROR;
00583 VSTRETCH (inimg, blocksize, &outimg);
00584 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00585 }
00586
00610 int
00611 Sadie_Contrast_RefStretchCmd (ClientData client_data, Tcl_Interp *interp,
00612 int objc, Tcl_Obj * const objv[])
00613 {
00614 IMAGE *inimg1 = NULL;
00615 IMAGE *inimg2 = NULL;
00616 IMAGE *outimg = NULL;
00617 uint32_t nlevels;
00618 int option;
00619
00620 if (objc != 2)
00621 {
00622 Tcl_WrongNumArgs (interp, 1, objv, atitle);
00623 return TCL_ERROR;
00624 }
00625 if ((GetSadieImageFromObj2 (interp, objv[1], "inimg,addr1", &inimg1)
00626 != TCL_OK)
00627 || (GetSadieImageFromObj2 (interp, objv[1], "inimg,addr2", &inimg2)
00628 != TCL_OK)
00629 || (GetSadieUintFromObj2 (interp, objv[1], "nlevels", &nlevels)
00630 != TCL_OK)
00631 || (GetSadieUintFromObj2 (interp, objv[1], "option", &option)
00632 != TCL_OK))
00633 return TCL_ERROR;
00634 MATCH (inimg1, inimg2, nlevels, (short)option, &outimg);
00635 return SetSadieImageObj2 (interp, objv[1], ixname, outimg);
00636 }
00637
00644 int
00645 Sadie_Contrast_Init (Tcl_Interp *interp)
00646 {
00647 Tcl_CreateObjCommand (interp, "Sadie_Contrast_NormStretch",
00648 Sadie_Contrast_NormStretchCmd, NULL, NULL);
00649 Tcl_CreateObjCommand (interp, "Sadie_Contrast_HisteqStretch",
00650 Sadie_Contrast_HisteqStretchCmd, NULL, NULL);
00651 Tcl_CreateObjCommand (interp, "Sadie_Contrast_LinearStretch",
00652 Sadie_Contrast_LinearStretchCmd, NULL, NULL);
00653 Tcl_CreateObjCommand (interp, "Sadie_Contrast_LogStretch",
00654 Sadie_Contrast_LogStretchCmd, NULL, NULL);
00655 Tcl_CreateObjCommand (interp, "Sadie_Contrast_PWLStretch",
00656 Sadie_Contrast_PWLStretchCmd, NULL, NULL);
00657 Tcl_CreateObjCommand (interp, "Sadie_Contrast_RootStretch",
00658 Sadie_Contrast_RootStretchCmd, NULL, NULL);
00659 Tcl_CreateObjCommand (interp, "Sadie_Contrast_SqrStretch",
00660 Sadie_Contrast_SqrStretchCmd, NULL, NULL);
00661 Tcl_CreateObjCommand (interp, "Sadie_Contrast_TblStretch",
00662 Sadie_Contrast_TblStretchCmd, NULL, NULL);
00663 Tcl_CreateObjCommand (interp, "Sadie_Contrast_QntStretch",
00664 Sadie_Contrast_QntStretchCmd, NULL, NULL);
00665 Tcl_CreateObjCommand (interp, "Sadie_Contrast_SatStretch",
00666 Sadie_Contrast_SatStretchCmd, NULL, NULL);
00667 Tcl_CreateObjCommand (interp, "Sadie_Contrast_ThreshStretch",
00668 Sadie_Contrast_ThreshStretchCmd, NULL, NULL);
00669 Tcl_CreateObjCommand (interp, "Sadie_Contrast_AdaptStretch",
00670 Sadie_Contrast_AdaptStretchCmd, NULL, NULL);
00671 Tcl_CreateObjCommand (interp, "Sadie_Contrast_RefStretch",
00672 Sadie_Contrast_RefStretchCmd, NULL, NULL);
00673 return TCL_OK;
00674 }