00001 #ifndef __JBXL_CPP_GRAPHIC_MATH_H_
00002 #define __JBXL_CPP_GRAPHIC_MATH_H_
00003
00004
00013 #include "Gdata.h"
00014
00015
00016
00017 namespace jbxl {
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00045
00046
00061 template <typename R, typename T> MSGraph<R> Laplacian(MSGraph<T> vp, int mode=0)
00062 {
00063 int i, j;
00064 int nx, ny, xs, xs2;
00065 R da, db, dc, dd, de, df, dg, dh;
00066 MSGraph<R> lp;
00067
00068 lp.mimicry(vp);
00069 lp.base = lp.zero = 0;
00070
00071 if (lp.isNull()) {
00072 DEBUG_MODE PRINT_MESG("LAPLACIAN: No More Memory!!!\n");
00073 lp.state = JBXL_GRAPH_MEMORY_ERROR;
00074 return lp;
00075 }
00076
00077 xs = vp.xs;
00078 xs2 = 2*xs;
00079
00080 if (mode==4) {
00081 for (j=1; j<vp.ys-1; j++) {
00082 ny = j*vp.xs;
00083 for (i=1; i<vp.xs-1; i++) {
00084 nx = ny + i;
00085 da = vp.gp[nx+1] + vp.gp[nx-1];
00086 db = vp.gp[nx];
00087 dc = vp.gp[nx+xs] + vp.gp[nx-xs];
00088 lp.gp[nx] = (R)(da - 4.*db + dc);
00089
00090
00091
00092
00093 }
00094 }
00095 }
00096
00097 else if (mode==8) {
00098 for (j=1; j<vp.ys-1; j++) {
00099 ny = j*vp.xs;
00100 for (i=1; i<vp.xs-1; i++) {
00101 nx = ny + i;
00102 da = vp.gp[nx+1] + vp.gp[nx-1];
00103 db = vp.gp[nx+xs] + vp.gp[nx-xs];
00104 dc = vp.gp[nx];
00105 dd = vp.gp[nx+1+xs] + vp.gp[nx-1+xs];
00106 de = vp.gp[nx+1-xs] + vp.gp[nx-1-xs];
00107 lp.gp[nx] = (R)(da + db - 8.*dc + dd + de);
00108
00109
00110
00111
00112
00113
00114 }
00115 }
00116 }
00117
00118 else {
00119 for (j=2; j<vp.ys-2; j++) {
00120 ny = j*vp.xs;
00121 for (i=2; i<vp.xs-2; i++) {
00122 nx = ny + i;
00123 da = vp.gp[nx];
00124 db = vp.gp[nx+1] + vp.gp[nx-1] + vp.gp[nx+xs] + vp.gp[nx-xs];
00125 dc = vp.gp[nx-1-xs2] + vp.gp[nx-xs2] + vp.gp[nx+1-xs2];
00126 dd = vp.gp[nx-1+xs2] + vp.gp[nx+xs2] + vp.gp[nx+1+xs2];
00127 de = vp.gp[nx-2-xs ] + vp.gp[nx-2] + vp.gp[nx-2+xs];
00128 df = vp.gp[nx+2-xs ] + vp.gp[nx+2] + vp.gp[nx+2+xs];
00129 dg = vp.gp[nx-2-xs2] + vp.gp[nx+2-xs2];
00130 dh = vp.gp[nx-2+xs2] + vp.gp[nx+2+xs2];
00131 lp.gp[nx] = (R)((-12.*da - 4.*db + 2.*(dc+dd+de+df) + dg + dh)/32.);
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 }
00143 }
00144 }
00145
00146 return lp;
00147 }
00148
00149
00158 template <typename R, typename T> MSGraph<R> xSobel(MSGraph<T> vp)
00159 {
00160 int i, j, k;
00161 int pl, nx, ny, nz;
00162 R da, db, dc, dd, de, nr;
00163 MSGraph<R> xp;
00164
00165 xp.mimicry(vp);
00166 xp.base = xp.zero = 0;
00167
00168 if (xp.isNull()) {
00169 DEBUG_MODE PRINT_MESG("XSOBEL: No More Memory!!!\n");
00170 xp.state = JBXL_GRAPH_MEMORY_ERROR;
00171 return xp;
00172 }
00173
00174
00175 CVCounter* vcounter = NULL;
00176 if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00177 if (vcounter!=NULL) vcounter->SetMax(vp.zs);
00178
00179 pl = vp.xs*vp.ys;
00180 for (k=0; k<vp.zs; k++) {
00181 nz = k*pl;
00182 for (j=1; j<vp.ys-1; j++) {
00183 ny = nz + j*vp.xs;
00184 for (i=1; i<vp.xs-1; i++) {
00185 nx = ny + i;
00186 da = vp.gp[nx+1-vp.xs] - vp.gp[nx-1-vp.xs];
00187 db = vp.gp[nx+1] - vp.gp[nx-1];
00188 dc = vp.gp[nx+1+vp.xs] - vp.gp[nx-1+vp.xs];
00189
00190
00191
00192
00193 if (k==0 || k==vp.zs-1) {
00194 dd = de = 0;
00195 nr = 8;
00196 }
00197 else {
00198 dd = vp.gp[nx+1-pl] - vp.gp[nx-1-pl];
00199 de = vp.gp[nx+1+pl] - vp.gp[nx-1+pl];
00200
00201
00202 nr = 12;
00203 }
00204
00205 xp.gp[nx] = (R)((da + 2.*db + dc + dd + de)/nr);
00206 }
00207 }
00208 if (vcounter!=NULL) vcounter->StepIt();
00209 }
00210
00211 return xp;
00212 }
00213
00214
00223 template<typename R, typename T> MSGraph<R> ySobel(MSGraph<T> vp)
00224 {
00225 int i, j, k;
00226 int pl, nx, ny, nz;
00227 R da, db, dc, dd, de, nr;
00228 MSGraph<R> xp;
00229
00230 xp.mimicry(vp);
00231 xp.base = xp.zero = 0;
00232
00233 if (xp.isNull()) {
00234 DEBUG_MODE PRINT_MESG("YSOBEL: No More Memory!!\n");
00235 xp.state = JBXL_GRAPH_MEMORY_ERROR;
00236 return xp;
00237 }
00238
00239
00240 CVCounter* vcounter = NULL;
00241 if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00242 if (vcounter!=NULL) vcounter->SetMax(vp.zs);
00243
00244 pl = vp.xs*vp.ys;
00245 for (k=0; k<vp.zs; k++) {
00246 nz = k*pl;
00247 for (j=1; j<vp.ys-1; j++) {
00248 ny = nz + j*vp.xs;
00249 for (i=1; i<vp.xs-1; i++) {
00250 nx = ny + i;
00251 da = vp.gp[nx-1+vp.xs] - vp.gp[nx-1-vp.xs];
00252 db = vp.gp[nx +vp.xs] - vp.gp[nx -vp.xs];
00253 dc = vp.gp[nx+1+vp.xs] - vp.gp[nx+1-vp.xs];
00254
00255
00256
00257
00258 if (k==0 || k==vp.zs-1) {
00259 dd = de = 0;
00260 nr = 8;
00261 }
00262 else {
00263 dd = vp.gp[nx+vp.xs-pl] - vp.gp[nx-vp.xs-pl];
00264 de = vp.gp[nx+vp.xs+pl] - vp.gp[nx-vp.xs+pl];
00265
00266
00267 nr = 12;
00268 }
00269
00270 xp.gp[nx] = (R)((da + 2.*db + dc + dd + de)/nr);
00271 }
00272 }
00273 if (vcounter!=NULL) vcounter->StepIt();
00274 }
00275
00276 return xp;
00277 }
00278
00279
00288 template<typename R, typename T> MSGraph<R> zSobel(MSGraph<T> vp)
00289 {
00290 int i, j, k;
00291 int pl, nx, ny, nz;
00292 R da, db, dc, dd, de;
00293 MSGraph<R> xp;
00294
00295 xp.mimicry(vp);
00296 xp.base = xp.zero = 0;
00297
00298 if (xp.isNull()) {
00299 DEBUG_MODE PRINT_MESG("ZSOBEL: No More Memory!!\n");
00300 xp.state = JBXL_GRAPH_MEMORY_ERROR;
00301 return xp;
00302 }
00303 if (vp.zs<2) {
00304 xp.state = JBXL_GRAPH_NODATA_ERROR;
00305 return xp;
00306 }
00307
00308
00309 CVCounter* vcounter = NULL;
00310 if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00311 if (vcounter!=NULL) vcounter->SetMax(vp.zs-1);
00312
00313 pl = vp.xs*vp.ys;
00314 for (k=1; k<vp.zs-1; k++) {
00315 nz = k*pl;
00316 for (j=1; j<vp.ys-1; j++) {
00317 ny = nz + j*vp.xs;
00318 for (i=1; i<vp.xs-1; i++) {
00319 nx = ny +i;
00320 da = vp.gp[nx-1+pl] - vp.gp[nx-1-pl];
00321 db = vp.gp[nx+1+pl] - vp.gp[nx+1-pl];
00322 dc = vp.gp[nx +pl] - vp.gp[nx -pl];
00323 dd = vp.gp[nx-vp.xs+pl] - vp.gp[nx-vp.xs-pl];
00324 de = vp.gp[nx+vp.xs+pl] - vp.gp[nx+vp.xs-pl];
00325
00326
00327
00328
00329
00330 xp.gp[nx] = (R)((da + db + 2.*dc + dd + de)/12.);
00331 }
00332 }
00333 if (vcounter!=NULL) vcounter->StepIt();
00334 }
00335
00336
00337 nz = (vp.zs-1)*pl;
00338 for (j=1; j<vp.ys-1; j++) {
00339 ny = j*vp.xs;
00340 for (i=1; i<vp.xs-1; i++) {
00341 nx = ny + i;
00342 da = vp.gp[nx];
00343 db = vp.gp[nx+pl];
00344 dc = vp.gp[nx+1 +pl] + vp.gp[nx-1 +pl];
00345 dd = vp.gp[nx+vp.xs+pl] + vp.gp[nx-vp.xs+pl];
00346
00347
00348
00349
00350 xp.gp[nx] = (R)((2.*db + dc + dd)/6. - da);
00351 }
00352
00353 ny = ny + nz;
00354 for (i=1; i<vp.xs-1; i++) {
00355 nx = ny + i;
00356 da = vp.gp[nx];
00357 db = vp.gp[nx-pl];
00358 dc = vp.gp[nx+1 -pl] + vp.gp[nx-1 -pl];
00359 dd = vp.gp[nx+vp.xs-pl] + vp.gp[nx-vp.xs-pl];
00360
00361
00362
00363
00364 xp.gp[nx] = (R)(da - (2.*db + dc + dd)/6.);
00365 }
00366 }
00367
00368 if (vcounter!=NULL) vcounter->PutFill();
00369
00370 return xp;
00371 }
00372
00373
00382 template<typename R, typename T> MSGraph<R> xxSobel(MSGraph<T> vp)
00383 {
00384 int i, j, k;
00385 int pl, nx, ny, nz, pl2, xs, xs2;
00386 R da, db, dc, dd, de;
00387 R df, dg, dh, di, dj, dk, dl, dm, nr;
00388 MSGraph<R> xp;
00389
00390 xp.mimicry(vp);
00391 xp.base = xp.zero = 0;
00392
00393 if (xp.isNull()) {
00394 DEBUG_MODE PRINT_MESG("XXSOBEL: No More Memory!!\n");
00395 xp.state = JBXL_GRAPH_MEMORY_ERROR;
00396 return xp;
00397 }
00398
00399
00400 CVCounter* vcounter = NULL;
00401 if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00402 if (vcounter!=NULL) vcounter->SetMax(vp.zs);
00403
00404 pl = vp.xs*vp.ys;
00405 pl2 = 2*pl;
00406 xs = vp.xs;
00407 xs2 = 2*vp.xs;
00408
00409 for (k=0; k<vp.zs; k++) {
00410 nz = k*pl;
00411 for (j=2; j<vp.ys-2; j++) {
00412 ny = nz + j*vp.xs;
00413 for (i=2; i<vp.xs-2; i++) {
00414 nx = ny + i;
00415 da = vp.gp[nx+2-xs2] - 2*vp.gp[nx-xs2] + vp.gp[nx-2-xs2];
00416 db = vp.gp[nx+2-xs ] - 2*vp.gp[nx-xs] + vp.gp[nx-2-xs];
00417 dc = vp.gp[nx+2] - 2*vp.gp[nx] + vp.gp[nx-2];
00418 dd = vp.gp[nx+2+xs] - 2*vp.gp[nx+xs] + vp.gp[nx-2+xs];
00419 de = vp.gp[nx+2+xs2] - 2*vp.gp[nx+xs2] + vp.gp[nx-2+xs2];
00420
00421
00422
00423
00424
00425
00426 if (k==0 || k==vp.zs-1) {
00427 dc = (R)(6.*dc);
00428 df = dg = dh = di = dj = dk = dl = dm = 0;
00429 nr = 64;
00430 }
00431 else {
00432 dc = (R)(8.*dc);
00433 df = vp.gp[nx+2-xs-pl] - 2*vp.gp[nx-xs-pl] + vp.gp[nx-2-xs-pl];
00434 dg = vp.gp[nx+2 -pl] - 2*vp.gp[nx -pl] + vp.gp[nx-2 -pl];
00435 dh = vp.gp[nx+2+xs-pl] - 2*vp.gp[nx+xs-pl] + vp.gp[nx-2+xs-pl];
00436 di = vp.gp[nx+2-xs+pl] - 2*vp.gp[nx-xs+pl] + vp.gp[nx-2-xs+pl];
00437 dj = vp.gp[nx+2 +pl] - 2*vp.gp[nx +pl] + vp.gp[nx-2 +pl];
00438 dk = vp.gp[nx+2+xs+pl] - 2*vp.gp[nx+xs+pl] + vp.gp[nx-2+xs+pl];
00439
00440
00441
00442
00443
00444
00445
00446 if (k==1 || k==vp.zs-2) {
00447 dl = dm = 0;
00448 nr = 136;
00449 }
00450 else {
00451 dl = vp.gp[nx+2-pl2] - 2*vp.gp[nx-pl2] + vp.gp[nx-2-pl2];
00452 dm = vp.gp[nx+2+pl2] - 2*vp.gp[nx+pl2] + vp.gp[nx-2+pl2];\
00453
00454
00455 nr = 144;
00456 }
00457 }
00458 xp.gp[nx] = (R)((dc + 4.*(db+dd+dg+dj) + 2.*(df+dh+di+dk) + da+de+dl+dm)/nr);
00459 }
00460 }
00461 if (vcounter!=NULL) vcounter->StepIt();
00462 }
00463
00464 return xp;
00465 }
00466
00467
00476 template<typename R, typename T> MSGraph<R> yySobel(MSGraph<T> vp)
00477 {
00478 int i, j, k;
00479 int pl, nx, ny, nz, pl2, xs, xs2;
00480 R da, db, dc, dd, de;
00481 R df, dg, dh, di, dj, dk, dl, dm, nr;
00482 MSGraph<R> xp;
00483
00484 xp.mimicry(vp);
00485 xp.base = xp.zero = 0;
00486
00487 if (xp.isNull()) {
00488 DEBUG_MODE PRINT_MESG("YYSOBEL: No More Memory!!\n");
00489 xp.state = JBXL_GRAPH_MEMORY_ERROR;
00490 return xp;
00491 }
00492
00493
00494 CVCounter* vcounter = NULL;
00495 if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00496 if (vcounter!=NULL) vcounter->SetMax(vp.zs);
00497
00498 pl = vp.xs*vp.ys;
00499 pl2 = 2*pl;
00500 xs = vp.xs;
00501 xs2 = 2*vp.xs;
00502
00503 for (k=0; k<vp.zs; k++) {
00504 nz = k*pl;
00505 for (j=2; j<vp.ys-2; j++) {
00506 ny = nz + j*vp.xs;
00507 for (i=2; i<vp.xs-2; i++) {
00508 nx = ny + i;
00509 da = vp.gp[nx-2+xs2] - 2*vp.gp[nx-2] + vp.gp[nx-2-xs2];
00510 db = vp.gp[nx-1+xs2] - 2*vp.gp[nx-1] + vp.gp[nx-1-xs2];
00511 dc = vp.gp[nx +xs2] - 2*vp.gp[nx] + vp.gp[nx -xs2];
00512 dd = vp.gp[nx+1+xs2] - 2*vp.gp[nx+1] + vp.gp[nx+1-xs2];
00513 de = vp.gp[nx+2+xs2] - 2*vp.gp[nx+2] + vp.gp[nx+2-xs2];
00514
00515
00516
00517
00518
00519
00520 if (k==0 || k==vp.zs-1) {
00521 dc = (R)(6.*dc);
00522 df = dg = dh = di = dj = dk = dl = dm = 0;
00523 nr = 64;
00524 }
00525 else {
00526 dc = (R)(8.*dc);
00527 df = vp.gp[nx-1+xs2-pl] - 2*vp.gp[nx-1-pl] + vp.gp[nx-1-xs2-pl];
00528 dg = vp.gp[nx +xs2-pl] - 2*vp.gp[nx -pl] + vp.gp[nx -xs2-pl];
00529 dh = vp.gp[nx+1+xs2-pl] - 2*vp.gp[nx+1-pl] + vp.gp[nx+1-xs2-pl];
00530 di = vp.gp[nx-1+xs2+pl] - 2*vp.gp[nx-1+pl] + vp.gp[nx-1-xs2+pl];
00531 dj = vp.gp[nx +xs2+pl] - 2*vp.gp[nx +pl] + vp.gp[nx -xs2+pl];
00532 dk = vp.gp[nx+1+xs2+pl] - 2*vp.gp[nx+1+pl] + vp.gp[nx+1-xs2+pl];
00533
00534
00535
00536
00537
00538
00539
00540 if (k==1 || k==vp.zs-2) {
00541 dl = dm = 0;
00542 nr = 136;
00543 }
00544 else {
00545 dl = vp.gp[nx+xs2-pl2] - 2*vp.gp[nx-pl2] + vp.gp[nx-xs2-pl2];
00546 dm = vp.gp[nx+xs2+pl2] - 2*vp.gp[nx+pl2] + vp.gp[nx-xs2+pl2];
00547
00548
00549 nr = 144;
00550 }
00551 }
00552 xp.gp[nx] = (R)((dc + 4.*(db+dd+dg+dj) + 2.*(df+dh+di+dk) + da+de+dl+dm)/nr);
00553 }
00554 }
00555 if (vcounter!=NULL) vcounter->StepIt();
00556 }
00557
00558 return xp;
00559 }
00560
00561
00570 template<typename R, typename T> MSGraph<R> zzSobel(MSGraph<T> vp)
00571 {
00572 int i, j, k;
00573 R da, db, dc, dd, de;
00574 R df, dg, dh, di, dj, dk, dl, dm;
00575 MSGraph<R> pp, xp;
00576
00577 if (vp.zs<2) {
00578 pp.mimicry(vp);
00579 pp.state = JBXL_GRAPH_NODATA_ERROR;
00580 return pp;
00581 }
00582
00583
00584 CVCounter* vcounter = NULL;
00585 CVCounter* ccounter = NULL;
00586 if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00587 if (vcounter!=NULL) {
00588 vcounter->SetMax(200);
00589 ccounter = vcounter->MakeChildCounter(100);
00590 SetGlobalCounter(ccounter);
00591 }
00592
00593 pp = zSobel<R>(vp);
00594
00595 if (vcounter!=NULL) {
00596 vcounter->DeleteChildCounter();
00597 ccounter = vcounter->MakeChildCounter(100);
00598 SetGlobalCounter(ccounter);
00599 }
00600
00601 if (!pp.isNull()) {
00602 xp = zSobel<R>(pp);
00603 pp.free();
00604 }
00605 else xp = pp;
00606
00607 if (vcounter!=NULL) {
00608 vcounter->DeleteChildCounter();
00609 SetGlobalCounter(vcounter);
00610 vcounter->PutFill();
00611 }
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635 return xp;
00636 }
00637
00638
00647 template <typename R, typename T> MSGraph<Vector<R> > vNabla(MSGraph<T> vp)
00648 {
00649 int i;
00650 MSGraph<R> px, py, pz;
00651 MSGraph<Vector<R> > nv;
00652
00653
00654 nv.xs = vp.xs;
00655 nv.ys = vp.ys;
00656 nv.zs = vp.zs;
00657 nv.zero.set(vp.zero, vp.zero, vp.zero);
00658 nv.base.set(vp.base, vp.base, vp.base);
00659 nv.RZxy = vp.RZxy;
00660 nv.rbound = vp.rbound;
00661
00662 nv.gp = (Vector<R>*)malloc(sizeof(Vector<R>)*nv.xs*nv.ys*nv.zs);
00663 if (nv.isNull()) {
00664 DEBUG_MODE PRINT_MESG("vNabla: No More Memory!!\n");
00665 nv.state = JBXL_GRAPH_MEMORY_ERROR;
00666 return nv;
00667 }
00668 for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00669 nv.gp[i] = nv.base;
00670 }
00671
00672 px = xSobel<R>(vp);
00673 if (px.gp==NULL) {
00674 nv.state = px.state;
00675 return nv;
00676 }
00677
00678 py = ySobel<R>(vp);
00679 if (py.gp==NULL) {
00680 px.free();
00681 nv.state = py.state;
00682 return nv;
00683 }
00684
00685 pz = zSobel<R>(vp);
00686 if (pz.gp==NULL) {
00687 px.free();
00688 py.free();
00689 nv.state = pz.state;
00690 return nv;
00691 }
00692
00693 for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00694 (nv.gp[i])->set_Vector(px.gp[i], py.gp[i], pz.gp[i]);
00695 }
00696
00697 px.free();
00698 py.free();
00699 pz.free();
00700
00701 return nv;
00702 }
00703
00704
00713 template <typename R, typename T> MSGraph<R> Nabla(MSGraph<T> vp)
00714 {
00715 int i;
00716 R xx, yy, zz;
00717 MSGraph<R> px, py, pz, nv;
00718
00719 nv.mimicry(vp);
00720 if (nv.isNull()) {
00721 DEBUG_MODE PRINT_MESG("Nabla: No More Memory!!\n");
00722 nv.state = JBXL_GRAPH_MEMORY_ERROR;
00723 return nv;
00724 }
00725
00726 px = xSobel<R>(vp);
00727 if (px.gp==NULL) {
00728 nv.state = px.state;
00729 return nv;
00730 }
00731
00732 py = ySobel<R>(vp);
00733 if (py.gp==NULL) {
00734 px.free();
00735 nv.state = py.state;
00736 return nv;
00737 }
00738
00739 pz = zSobel<R>(vp);
00740 if (pz.gp==NULL) {
00741 px.free();
00742 py.free();
00743 nv.state = pz.state;
00744 return nv;
00745 }
00746
00747 for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00748 xx = px.gp[i];
00749 yy = py.gp[i];
00750 zz = pz.gp[i];
00751 nv.gp[i] = (R)sqrt((double)xx*xx + yy*yy + zz*zz);
00752 }
00753
00754 px.free();
00755 py.free();
00756 pz.free();
00757
00758 return nv;
00759 }
00760
00761
00774 template <typename R, typename T> MSGraph<R> edgeEnhance(MSGraph<T> gd, int mode=0)
00775 {
00776 int i;
00777 MSGraph<R> la, vp;
00778
00779 vp.mimicry(gd);
00780 if (vp.isNull()) {
00781 DEBUG_MODE PRINT_MESG("edgeEnhance: No More Memory!!\n");
00782 vp.state = JBXL_GRAPH_MEMORY_ERROR;
00783 return vp;
00784 }
00785
00786 la = Laplacian<R>(gd, mode);
00787 for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00788 vp.gp[i] = gd.gp[i] - la.gp[i];
00789 }
00790 la.free();
00791
00792 return vp;
00793 }
00794
00795
00806 template <typename T> MSGraph<T> medianFilter(MSGraph<T> xp, int ms=3)
00807 {
00808 int i, j, x, y, z, cx;
00809 int xx, yy, zz, cw, ux, mz;
00810 int kc, xc, zc, xs, ps;
00811 T* me;
00812 MSGraph<T> vp;
00813
00814 mz = Min(ms, xp.zs);
00815 me = (T*)malloc(ms*ms*mz*sizeof(T));
00816
00817 vp.mimicry(xp);
00818 if (vp.isNull()) {
00819 free(me);
00820 DEBUG_MODE PRINT_MESG("medianFilter: No More Memory!!\n");
00821 vp.state = JBXL_GRAPH_MEMORY_ERROR;
00822 return vp;
00823 }
00824
00825 kc = ms*ms*mz/2;
00826 xc = ms/2;
00827 zc = mz/2;
00828 xs = xp.xs;
00829 ps = xp.xs*xp.ys;
00830 z = xp.zs/2;
00831 for(y=xc; y<xp.ys-xc; y++)
00832 for(x=xc; x<xp.xs-xc; x++) {
00833 cx = z*ps + y*xs + x;
00834 i = 0;
00835 for (zz=-zc; zz<=zc; zz++)
00836 for (yy=-xc; yy<=xc; yy++)
00837 for (xx=-xc; xx<=xc; xx++) {
00838 cw = cx + xx + yy*xs + zz*ps;
00839 me[i++] = xp.gp[cw];
00840 }
00841 for (i=0; i<ms*ms*mz-1; i++)
00842 for (j=i+1; j<ms*ms*mz; j++) {
00843 if (me[i]<me[j]) {
00844 ux = me[i];
00845 me[i] = me[j];
00846 me[j] = ux;
00847 }
00848 }
00849 vp.gp[cx-z*ps] = me[kc];
00850 }
00851
00852 free(me);
00853 return vp;
00854 }
00855
00856
00869 template <typename T> MSGraph<int> euclidDistance(MSGraph<T> vp, int bc, int& rr)
00870 {
00871 int i, j, k, l, df, d, w;
00872 int rmax, rstart, rend;
00873 int nx, ny, nz, pl;
00874
00875 rr = -1;
00876 MSGraph<int> pp(vp.xs, vp.ys, vp.zs, (int)vp.zero, (int)vp.base, vp.RZxy);
00877 if (pp.isNull()) {
00878 DEBUG_MODE PRINT_MESG("euclidDistance: No More Memory!! E1\n");
00879 pp.state = JBXL_GRAPH_MEMORY_ERROR;
00880 return pp;
00881 }
00882
00883 for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00884 if (vp.gp[i]>=bc) pp.gp[i] = 1;
00885 else pp.gp[i] = 0;
00886 }
00887
00888 pl = vp.xs*vp.ys;
00889
00890 for (k=0; k<vp.zs; k++) {
00891 nz = k*pl;
00892 for (j=0; j<vp.ys; j++) {
00893 df = vp.xs;
00894 ny = nz + j*vp.xs;
00895 for (i=0; i<vp.xs; i++) {
00896 nx = ny + i;
00897 if (pp.gp[nx]!=0) df = df + 1;
00898 else df = 0;
00899 pp.gp[nx] = df*df;
00900 }
00901 }
00902 }
00903
00904 for (k=0; k<vp.zs; k++) {
00905 nz = k*pl;
00906 for (j=0; j<vp.ys; j++) {
00907 df = vp.xs;
00908 ny = nz + j*vp.xs;
00909 for (i=vp.xs-1; i>=0; i--) {
00910 nx = ny + i;
00911 if (pp.gp[nx]!=0) df = df + 1;
00912 else df = 0;
00913 pp.gp[nx] = Min(pp.gp[nx], df*df);
00914 }
00915 }
00916 }
00917
00918 rmax = Max(vp.ys, vp.zs);
00919 MSGraph<int> buf(rmax);
00920 if (buf.isNull()) {
00921 pp.free();
00922 DEBUG_MODE PRINT_MESG("euclidDistance: No More Memory!! E2\n");
00923 pp.state = JBXL_GRAPH_MEMORY_ERROR;
00924 return pp;
00925 }
00926
00927 for (k=0; k<vp.zs; k++) {
00928 nz = k*pl;
00929 for (i=0; i<vp.xs; i++) {
00930 nx = nz + i;
00931 for (j=0; j<vp.ys; j++) buf.gp[j] = pp.gp[nx+j*vp.xs];
00932 for (j=0; j<vp.ys; j++) {
00933 ny = nx + j*vp.xs;
00934 d = buf.gp[j];
00935 if (d!=0) {
00936 rmax = (int)sqrt((double)d) + 1;
00937 rstart = Min(rmax, j);
00938 rend = Min(rmax, vp.ys-j-1);
00939 for (l=-rstart; l<=rend; l++) {
00940 w = buf.gp[j+l] + l*l;
00941 if (w<d) d = w;
00942 }
00943 }
00944 pp.gp[ny] = d;
00945 }
00946 }
00947 }
00948 buf.clear();
00949
00950 rr = 0;
00951 for (j=0; j<vp.ys; j++) {
00952 ny = j*vp.xs;
00953 for (i=0; i<vp.xs; i++) {
00954 nx = ny + i;
00955 for (k=0; k<vp.zs; k++) buf.gp[k] = pp.gp[nx+k*pl];
00956 for (k=0; k<vp.zs; k++) {
00957 nz = nx + k*pl;
00958 d = buf.gp[k];
00959 if (d!=0) {
00960 rmax = (int)sqrt((double)d) + 1;
00961 rstart = Min(rmax, k);
00962 rend = Min(rmax, vp.zs-k-1);
00963 for (l=-rstart; l<=rend; l++) {
00964 w = buf.gp[k+l] + l*l;
00965 if (w<d) d = w;
00966 }
00967 rr = Max(rr, d);
00968 }
00969 pp.gp[nz] = d;
00970 }
00971 }
00972 }
00973 buf.free();
00974
00975 return pp;
00976 }
00977
00978
00979
00981
00982
00983
00984 #define FILTER_NON 0
00985 #define FILTER_ABS 1
00986 #define FILTER_MINMAX 2
00987 #define FILTER_NORM 3
00988
00989
00990
00991
00992
00993 template <typename R, typename T> MSGraph<R> MSMaskFilter(MSGraph<R> vp, MSGraph<T> filter, int mode=FILTER_NON)
00994 {
00995 MSGraph<R> xp;
00996
00997 if (vp.xs<filter.xs || vp.ys<filter.ys || vp.zs<filter.zs) {
00998 DEBUG_MODE PRINT_MESG("MSMaskFilter: Error: mismach filter dimension!!\n");
00999 xp.state = JBXL_GRAPH_NODATA_ERROR;
01000 return xp;
01001 }
01002 if (filter.norm==0.0) {
01003 DEBUG_MODE PRINT_MESG("MSMaskFilter: Error: norm of filter is zero!!\n");
01004 xp.state = JBXL_GRAPH_NODATA_ERROR;
01005 return xp;
01006 }
01007
01008 xp.mimicry(vp);
01009
01010 int xs = filter.xs/2;
01011 int ys = filter.ys/2;
01012 int zs = filter.zs/2;
01013
01014 for (int k=zs; k<xp.zs-zs; k++) {
01015 for (int j=ys; j<xp.ys-ys; j++) {
01016 for (int i=xs; i<xp.xs-xs; i++) {
01017
01018 T conv = (T)0;
01019 for (int n=-zs; n<=zs; n++) {
01020 for (int m=-ys; m<=ys; m++) {
01021 for (int l=-xs; l<=xs; l++) {
01022 conv += filter.point(xs+l, ys+m, zs+n) * vp.point(i+l, j+m, k+n);
01023 }
01024 }
01025 }
01026
01027 R pt = (R)(conv/filter.norm);
01028
01029 if (mode==FILTER_ABS && pt<(R)0) pt = -pt;
01030 else if (mode==FILTER_MINMAX) {
01031 if (pt<(R)vp.min) pt = (R)vp.min;
01032 else if (pt>(R)vp.max) pt = (R)vp.max;
01033 }
01034 xp.point(i, j, k) = pt;
01035 }
01036 }
01037 }
01038
01039 xp.get_minmax();
01040 if (mode==FILTER_NORM && xp.max!=xp.min) {
01041 for (int i=0; i<xp.xs*xp.ys*xp.zs; i++) {
01042 xp.gp[i] = (R)(((T)(xp.gp[i]-xp.min)*(vp.max-vp.min))/(xp.max-xp.min) + vp.min);
01043 }
01044 xp.get_minmax();
01045 }
01046
01047 return xp;
01048 }
01049
01050
01051 }
01052
01053
01054
01055 #endif
01056
01057