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