チェイン符号化を実装

C言語ライクの仮想プログラムを想定。
元々チェイン符号化の要領で輪郭ピクセル数を測定するために作成。
まぁ臨機応変にvector型の変数等にx,y座標を格納していったり、
自由にアレンジしてください。

日本語は関数とか変数の説明。実際には適当な名前を付けるべし。
x,y座標の画素取得方法は環境により多種多様なので、ここでは記述しない。
もっとスマートな実装方法はいくらでもあると思うが、
その辺は管理人の腕が無いということでご勘弁。

bool 始点と終点を見分けるフラグ = true;
int 始点x座標,始点y座標;
void 始点の決定とチェイン符号化開始() {
    bool end = false;
   for(int y = 0; y < 高さ; y++) {
       for(int x = 0; x < 幅; x++) {
          if(x,y座標の画素取得関数が黒) {
              始点x座標 = x;
              始点y座標 = y;
              end = true;
          }
          if(end) break;
       }
       if(end) break;
   }
   チェイン符号化開始(始点x座標,始点y座標,右上矢印);
}

void チェイン符号化(int x,int y,現在の矢印) {
   bool 矢印が最初の物かどうかを見分けるフラグ = true;
   bool gotoの代わり = false;
   //x,y座標が始点と同じ時で且つ初回で無いときはこの関数は何もしない
   if((x == 始点x座標 && y == 始点y座標) && 始点と終点を見分けるフラグ == false) return;
   最初の矢印 = 現在の矢印;
   while(現在の矢印 != 最初の矢印 || 矢印が最初の物かどうかを見分けるフラグ == true) {
      //もう矢印は最初の物である必要はないのでフラグをfalseにする
       矢印が最初の物かどうかを見分けるフラグ = false;
      if(gotoの代わり==true) break;
      switch(現在の矢印) {
         case 右上:
           if(画素値が黒かチェック(x+1,y-1)) {
             チェイン符号化(x+1,y-1,左);
             gotoの代わり = true;
           } else {
             現在の矢印 = 右; //次の矢印をチェックする
           }
           break;
         case 右:
           if(画素値が黒かチェック(x+1,y)) {
             チェイン符号化(x+1,y,左上);
             gotoの代わり = true;
           } else {
             現在の矢印 = 右下; //次の矢印をチェックする
             }
           break;
         case 右下:
           if(画素値が黒かチェック(x+1,y+1)) {
             チェイン符号化(x+1,y+1,上);
             gotoの代わり = true;
           } else {
             現在の矢印 = 下; //次の矢印をチェックする
             }
           break;
         case 下:
           if(画素値が黒かチェック(x,y+1)) {
             チェイン符号化(x,y+1,右上);
             gotoの代わり = true;
           } else {
             現在の矢印 = 左下; //次の矢印をチェックする
             }
           break;
         case 左下:
           if(画素値が黒かチェック(x-1,y+1)) {
             チェイン符号化(x-1,y+1,右);
             gotoの代わり = true;
           } else {
             現在の矢印 = 左; //次の矢印をチェックする
             }
           break;
         case 左:
           if(画素値が黒かチェック(x-1,y)) {
             チェイン符号化(x-1,y,右下);
             gotoの代わり = true;
           } else {
             現在の矢印 = 右; //次の矢印をチェックする
             }
           break;
         case 左上:
           if(左上の画素値が黒(x-1,y-1)) {
             チェイン符号化(x-1,y-1,下);
             gotoの代わり = true;
           } else {
             現在の矢印 = 上; //次の矢印をチェックする
             }
           break;
         case 上:
           if(上の画素値が黒(x,y-1)) {
             チェイン符号化(x,y-1,左下);
             gotoの代わり = true;
           } else {
             現在の矢印 = 右上; //次の矢印をチェックする
             }
           break;
         default:
           break;
      }
   }
}
最終更新:2009年10月28日 23:24