#ifndef __JBXL_CPP_MORPHOLOGY_H_ #define __JBXL_CPP_MORPHOLOGY_H_ /** @brief モルフォリジーライブラリ @file Morph.h @author Fumi.Iseki (C) @date 2004 8/31 @attention このライブラリは,チェックと見直しが必要 '04 8/31 */ #include "Gdata.h" // namespace jbxl { #define OPENING 0 #define CLOSING 1 #define DILATION 2 #define SPHERE_ELEMENT 1 /* template MSGraph Morphology(MSGraph vp, MSGraph xp, int cc, int mode); template MSGraph opening_morph(MSGraph vp, MSGraph xp, int cc); template bool point_open_morph(MSGraph vp, int x, int y, int z, MSGraph xp, int cc); template void copy_morph_element(MSGraph vp, int x, int y, int z, MSGraph xp); template MSGraph fat_object_morph(MSGraph vp, MSGraph xp, int cc); template bool point_fat_object_morph(MSGraph vp, int x, int y, int z, MSGraph xp, int cc); template MSGraph make_element_morph(Parameter x); */ /** template MSGraph Morphology(MSGraph vp, MSGraph xp, int cc, int mode) 画像vpに対して,エレメントxpで,modeのモルフォロジー演算を行う.@n 現在は OPENING のmodeしかサポートしていない. @param vp 処理対象の元データ @param xp エレメント画像 @param cc 閾値.この輝度値以上の画素に対して演算を行う @param mode 演算の種類を指定 @return 処理結果の画像 */ template MSGraph Morphology(MSGraph vp, MSGraph xp, int cc, int mode) { MSGraph wp; if (mode==OPENING) wp = opening_morph(vp, xp, cc); else { DEBUG_MODE PRINT_MESG("MORPHOLOGY: サポートしていない演算です = %d\n", mode); } return wp; } /** template MSGraph opening_morph(MSGraph vp, MSGraph xp, int cc) 画像vpに対して,エレメントxpで,modeのモルフォロジー演算のオープニングを行う.@n 元画像は保持される. @param vp 処理対象の元データ @param xp エレメント画像 @param cc 閾値.この輝度値以上の画素に対して演算を行う @return 処理結果の画像 */ template MSGraph opening_morph(MSGraph vp, MSGraph xp, int cc) { int i, j, k, ks, cz, cy, cx, ps; bool err; MSGraph wp(vp.xs, vp.ys, vp.zs); if (wp.isNull()) return wp; ps = vp.xs*vp.ys; for (k=0; k=cc) { err = point_open_morph(vp, i, j, k, xp, cc); if (err) copy_morph_element(wp, i, j, k, xp); } } } } return wp; } /** template bool point_open_morph(MSGraph vp, int x, int y, int z, MSGraph xp, int cc) オープニング可能かどうかチェックする. */ template bool point_open_morph(MSGraph vp, int x, int y, int z, MSGraph xp, int cc) { int i, j, k, cx, cy, cz; int xx, yy, zz, ax, ay, az; for (k=0; kvp.zs-1) zz = vp.zs-1; az = vp.xs*vp.ys*zz; cz = xp.xs*xp.ys*k; for (j=0; j0) { if (!(xx>=0&&xx=0&&yy void copy_morph_element(MSGraph vp, int x, int y, int z, MSGraph xp) エレメントを対象画像にコピーする. */ template void copy_morph_element(MSGraph vp, int x, int y, int z, MSGraph xp) { int i, j, k, cx, cy, cz; int xx, yy, zz, ax, ay, az; for (k=0; k=0&&xx=0&&yy=0&&zz0) vp.gp[ax] = xp.gp[cx]; } } } } } /** template MSGraph fat_object_morph(MSGraph vp, MSGraph xp, int cc) 画像を太らせる処理(何て言うんだっけ?) */ template MSGraph fat_object_morph(MSGraph vp, MSGraph xp, int cc) { int i, j, k, ps, cz, cy, cx; bool err; MSGraph wp(vp.xs, vp.ys, vp.zs); if (wp.isNull()) return wp; ps = vp.xs*vp.ys; for (k=0; k=cc) { err = point_fat_object_morph(vp, i, j, k, xp, cc); if (err) copy_morph_element(wp, i, j, k, xp); } } } } return wp; } /** template bool point_fat_object_morph(MSGraph vp, int x, int y, int z, MSGraph xp, int cc) */ template bool point_fat_object_morph(MSGraph vp, int x, int y, int z, MSGraph xp, int cc) { int i, j, k, cx, cy, cz; int xx, yy, zz, ax, ay, az; for (k=0; kvp.zs-1) zz = vp.zs-1; az = vp.xs*vp.ys*zz; cz = xp.xs*xp.ys*k; for (j=0; j0) { if (xx>=0&&xx=0&&yy=cc) return true; } } } } } return false; } /** template MSGraph make_element_morph(Parameter x) モルフォロジー演算のエレメントを生成する. */ template MSGraph make_element_morph(Parameter32 x) { int *p, n, m, r, c, i, j, k, z; int nn, xs, ir; double s, sn, cs, dr, dt, df, th, fi, rx, zz; MSGraph vp, xp; p = (int*)x.pm; m = p[0]; // mode r = p[1]; // hankei c = p[2]; // color s = p[3]/p[4]; // RZxy; if (m==SPHERE_ELEMENT) { xs = 2*r + 1; vp.getm(xs, xs, (int)(xs*s+0.5)); if (vp.isNull()) return vp; xp.xs = xs; xp.ys = xs; xp.zs = 1; for (z=0; z