00001 
00002 #ifndef  __JBXL_CPP_MORPHOLOGY_H_
00003 #define  __JBXL_CPP_MORPHOLOGY_H_
00004 
00005 
00017 #include "Gdata.h"
00018 
00019 
00020 
00021 namespace jbxl {
00022 
00023 
00024 #define  OPENING   0
00025 #define  CLOSING   1
00026 #define  DILATION  2
00027 
00028 #define  SPHERE_ELEMENT    1
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00055 template <typename T>  MSGraph<T> Morphology(MSGraph<T> vp, MSGraph<T> xp, int cc, int mode)
00056 {
00057     MSGraph<T> wp;
00058 
00059     if (mode==OPENING) wp = opening_morph(vp, xp, cc);
00060     else {
00061         DEBUG_MODE PRINT_MESG("MORPHOLOGY: サポートしていない演算です = %d\n", mode);
00062     }
00063     return wp;
00064 }
00065 
00066 
00079 template <typename T>  MSGraph<T>  opening_morph(MSGraph<T> vp, MSGraph<T> xp, int cc)
00080 {
00081     int  i, j, k, ks, cz, cy, cx, ps;
00082     bool err;
00083     MSGraph<T> wp(vp.xs, vp.ys, vp.zs);
00084     if (wp.isNull()) return wp;
00085 
00086     ps = vp.xs*vp.ys;
00087     for (k=0; k<vp.zs; k++) {
00088         cz = k*ps;
00089         for (j=0; j<vp.ys; j++) {
00090             cy = cz + j*vp.xs;
00091             for (i=0; i<vp.xs; i++) {
00092                 cx = cy + i;
00093                 if (vp.gp[cx]>=cc) {
00094                     err = point_open_morph(vp, i, j, k, xp, cc);
00095                     if (err) copy_morph_element(wp, i, j, k, xp);
00096                 }
00097             }
00098         }
00099     }
00100 
00101     return wp;
00102 }
00103 
00104 
00110 template <typename T>  bool  point_open_morph(MSGraph<T> vp, int x, int y, int z, MSGraph<T> xp, int cc)
00111 {
00112     int  i, j, k, cx, cy, cz;
00113     int  xx, yy, zz, ax, ay, az;
00114 
00115     for (k=0; k<xp.zs; k++) {
00116         zz = z + k - xp.zs/2;
00117         if (zz<0)       zz = 0;
00118         if (zz>vp.zs-1) zz = vp.zs-1;
00119         az = vp.xs*vp.ys*zz;
00120         cz = xp.xs*xp.ys*k; 
00121         for (j=0; j<xp.ys; j++) {
00122             yy = y + j - xp.ys/2;
00123             ay = az + vp.xs*yy; 
00124             cy = cz + xp.xs*j;  
00125             for (i=0; i<xp.xs; i++) {
00126                 xx = x + i - xp.xs/2;
00127                 ax = ay + xx;   
00128                 cx = cy + i;    
00129                 if (xp.gp[cx]>0) {
00130                     if (!(xx>=0&&xx<vp.xs&&yy>=0&&yy<vp.ys)) return false;
00131                     if (vp.gp[ax]<cc) return false;
00132                 }
00133             }
00134         }
00135     }
00136    
00137     return true;
00138 }
00139 
00140 
00146 template <typename T>  void  copy_morph_element(MSGraph<T> vp, int x, int y, int z, MSGraph<T> xp)
00147 {
00148     int  i, j, k, cx, cy, cz;
00149     int  xx, yy, zz, ax, ay, az;
00150 
00151     for (k=0; k<xp.zs; k++) {
00152         zz = z + k - xp.zs/2;
00153         az = vp.xs*vp.ys*zz;
00154         cz = xp.xs*xp.ys*k; 
00155         for (j=0; j<xp.ys; j++) {
00156             yy = y + j - xp.ys/2;
00157             ay = az + vp.xs*yy; 
00158             cy = cz + xp.xs*j;  
00159             for (i=0; i<xp.xs; i++) {
00160                 xx = x + i - xp.xs/2;
00161                 ax = ay + xx;   
00162                 cx = cy + i;    
00163                 if (xx>=0&&xx<vp.xs&&yy>=0&&yy<vp.ys&&zz>=0&&zz<vp.zs){
00164                     if (xp.gp[cx]>0) vp.gp[ax] = xp.gp[cx];
00165                 }
00166             }
00167         }
00168     }
00169 }
00170 
00171 
00177 template <typename T> MSGraph<T>  fat_object_morph(MSGraph<T> vp, MSGraph<T> xp, int cc)
00178 {
00179     int  i, j, k, ps, cz, cy, cx;
00180     bool err;
00181     MSGraph<T> wp(vp.xs, vp.ys, vp.zs);
00182     if (wp.isNull()) return wp;
00183 
00184     ps = vp.xs*vp.ys;
00185     for (k=0; k<vp.zs; k++) {
00186         cz = k*ps;
00187         for (j=0; j<vp.ys; j++) {
00188             cy = cz + j*vp.xs;
00189             for (i=0; i<vp.xs; i++) {
00190                 cx = cy + i;
00191                 if (vp.gp[cx]>=cc) {
00192                     err = point_fat_object_morph(vp, i, j, k, xp, cc);
00193                     if (err) copy_morph_element(wp, i, j, k, xp);
00194                 }
00195             }
00196         }
00197     }
00198 
00199     return wp;
00200 }
00201 
00202 
00206 template <typename T>  bool  point_fat_object_morph(MSGraph<T> vp, int x, int y, int z, MSGraph<T> xp, int cc)
00207 {
00208     int  i, j, k, cx, cy, cz;
00209     int  xx, yy, zz, ax, ay, az;
00210 
00211     for (k=0; k<xp.zs; k++) {
00212         zz = z + k - xp.zs/2;
00213         if (zz<0)       zz = 0;
00214         if (zz>vp.zs-1) zz = vp.zs-1;
00215         az = vp.xs*vp.ys*zz;
00216         cz = xp.xs*xp.ys*k; 
00217         for (j=0; j<xp.ys; j++) {
00218             yy = y + j - xp.ys/2;
00219             ay = az + vp.xs*yy; 
00220             cy = cz + xp.xs*j;  
00221             for (i=0; i<xp.xs; i++) {
00222                 xx = x + i - xp.xs/2;
00223                 ax = ay + xx;   
00224                 cx = cy + i;    
00225                 if (xp.gp[cx]>0) {
00226                     if (xx>=0&&xx<vp.xs&&yy>=0&&yy<vp.ys) {
00227                         if (vp.gp[ax]>=cc)  return true;
00228                     }
00229                 }
00230             }
00231         }
00232     }
00233    
00234     return false;
00235 }
00236 
00237 
00243 template <typename T>  MSGraph<T>  make_element_morph(Parameter32 x)
00244 {
00245     int    *p, n, m, r, c, i, j, k, z;
00246     int    nn, xs, ir;
00247     double s, sn, cs, dr, dt, df, th, fi, rx, zz;
00248     MSGraph<T> vp, xp;
00249   
00250     p = (int*)x.pm; 
00251     m = p[0];               
00252     r = p[1];               
00253     c = p[2];               
00254     s = p[3]/p[4];          
00255 
00256     if (m==SPHERE_ELEMENT) {
00257         xs = 2*r + 1;
00258         vp.getm(xs, xs, (int)(xs*s+0.5));
00259         if (vp.isNull()) return vp;
00260 
00261         xp.xs = xs; 
00262         xp.ys = xs; 
00263         xp.zs = 1;
00264 
00265         for (z=0; z<vp.zs; z++) {
00266             xp.gp = &vp.gp[z*vp.xs*vp.ys];
00267             zz = Min(r, Xabs(((vp.zs-1.)/2.-z)/s));
00268             ir = (int)(sqrt(Max(r*r-zz*zz, 0.0))+0.5); 
00269             circle(xp, r, r, ir, c, ON);
00270         }
00271     } 
00272     else {
00273         DEBUG_MODE PRINT_MESG("MAKE_ELEMENT_MORPH: no support mode = %d\n",m);
00274         exit(1);
00275     }
00276 
00277     return vp;
00278 }
00279 
00280 
00281 }       
00282 
00283 
00284 #endif
00285