图元识别

图元就是一个二值图形中的连通域,图元识别就是寻找图像中的连通域。
求解策略:
通过扫描像素来识别图元。扫描方式是逐行扫描。当扫描到一个未标记的图元像素时,给它一个图元标记。然后把这个图元像素作为一个新图元的种子,通过识别和标记所有与该种子相邻的图元像素,来寻找新图元剩余的像素。
由于需要用1表示未做标记的图元像素,所以我们采用2,3,4,5……来做图元标记。

void labelComponents()
{//给图元编号
//初始化数组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;   

//初始化0像素围墙
for(int i=0;i<=size+1;i++)
{
    pixel[0][i]=pixel[size+1][i]=0;//底部和顶部
    pixel[i][0]=pixel[i][size+1]=0;//左和右
}
int numOfNbrs=4;
//扫描所有像素,标记图元
arrayQueueq;
position here,nbr;
int id=1;
for(int r=1;r<=size;r++)//从上到下
    for(int c=1;c<=size;c++)//从左到右
        if(pixel[r][c]==1)//发现新像元
        {
            pixel[r][c]=++id;//id增加1
            here.row=r;//该像元设为种子点
            here.col=c;

            while(true)
            {
                for(int i=0;i//检查该种子点的所有领域
                {//检查所有相邻位置
                   nbr.row=here.row+offset[i].row;
                   nbr.row=here.row+offset[i].row;
                   if(pixel[nbr.row][nbr.col]==1)
                   {
                       pixel[nbr.row][nbr.col]=id;
                       q.push[nbr]//将所有可标记领域插入队列
                   }

                }
                if(q.empty())break;
                here=q.front();//寻找相应的邻域的邻域。直到队列为0.
                q.pop();
            }
        }
}

和之前的最短距离代码很像。

你可能感兴趣的:(C++算法)