//pget(int x, int y) : 入力画像の指定したx,y座標からピクセルの色を読み出す(0か1)
//pset(int x, int y, int c) : 出力画像の指定したx,y座標に色をセットする(cは0か1)
//width : 画像幅
//height : 画像高さ
int sx, sy; //追跡開始点
int px, py; //追跡点
int vec; //調査点フラグ
int IsFirst; //
//画像内を捜査し有効画素を探す
for(sy=0; sy < height; sy++) {
for(sx=0; sx < width; sx++) {
//有効画素があった場合ループから抜ける
if( pget(sx, sy) != 0 ) {
break;
}
}
}
//有効画素が見つかっていた場合、追跡処理に入る
if( sx < width ) {
px = sx;
py = sy;
pset(px, py, 1);
vec = 2; //最初の調査点を左下にセットする
IsFirst = 1;
//追跡開始点と追跡点が同じ座標なるまで輪郭追跡処理
while( px != sx || py != sy || IsFirst == 1 ) {
switch(vec) {
case 0: //左上を調査
if( pget(px-1, py-1) != 0 ) {
pset(px-1, py-1, 1);
px = px-1; py = py-1;
vec = 6;
break;
}
case 1: //左を調査
if( pget(px-1, py) != 0 ) {
pset(px-1, py, 1);
px = px-1;
vec = 0;
break;
}
case 2: //左下を調査
if( pget(px-1, py+1) != 0 ) {
pset(px-1, py+1, 1);
px = px-1; py = py+1;
IsFirst = 0;
vec = 0;
break;
}
case 3: //下を調査
if( pget(px, py+1) != 0 ) {
pset(px, py+1, 1);
py = py+1;
IsFirst = 0;
vec = 2;
break;
}
case 4: //右下を調査
if( pget(px+1, py+1) != 0 ) {
pset(px+1, py+1, 1);
px = px+1; py = py+1;
IsFirst = 0;
vec = 2;
break;
}
case 5: //右を調査
if( pget(px+1, py) != 0 ) {
pset(px+1, py, 1);
px = px+1;
IsFirst = 0;
vec = 4;
break;
}
else {
//孤立点であった場合
if( IsFirst == 1 ) {
IsFirst = 0;
break;
}
}
case 6: //右上を調査
if( pget(px+1, py-1) != 0 ) {
pset(px+1, py-1, 1);
px = px+1; py = py-1;
vec = 4;
break;
}
case 7: //上を調査
if( pget(px, py-1) != 0 ) {
pset(px, py-1, 1);
px = px; py = py-1;
vec = 6;
break;
}
vec = 0;
}
}
}
|