识别图元(Queue)

void Label()
{
 //初始化围墙
 for(int i=0;i<=m+1;i++)
 {
  pixel[0][i]=pixel[m+1][i]=0;
  pixel[i][0]=pixel[i][m+1]=0;
 }

 // 初始化offset
 Position offset[4];
 offset[0].row=0; offset[0].col=1; // 右
 offset[1].row=1; offset[1].col=0; //下
 offset[2].row=0; offset[2].col=-1; //左
 offset[3].row=-1; offset[3].col=0; //上

 int NumofNbrs=4;
 LinkedQueue<Position> Q;
 int id=1;
 Position here, nbr;

 //扫描所有象素
 for(int r=1; r<=m; r++)
  for(int c=1;c<=m; c++)
  {
   if(pixel[r][c]==1)// 新图元
   {
    pixel[r][c]==++id;
    here.row=r;
    here.col=c;
   }

   // 寻找其余图元
   do  
   {
    for(int i=0; i<NumofNbrs; i++)
    {
     //检查当前象素的所有相邻象素
     nbr.row=here.row+offset[i].row;
     nbr.col=here.row+offset[i].col;
     if(pixel[nbr.row][nbr.col]==1)
     {
      pixel[nbr.row][nbr.col]=id;
      Q.Add(nbr);
     }
    }
    // 还有未探索的象素吗?
    if(Q.IsEmpty())
     break;
    Q.Delete(here);
   }while(1);
  }
}

Ref:<<数据结构,算法与应用>>P204~206

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值