for(j=0;j if(iEdgePoint[i][j]!=255) { // ÉèÖÃΪ·Ç±ß½çµã iEdgePoint[i][j] = 0 ; } } } } void Canny::SetThreshold(int **iExtent,int *iThreHigh,int *iThreLow,int **iEdgePoint) { int i,j,k; int GradHist[1024]; //ͳ¼ÆÌݶÈÖ±·½Í¼µÄÊý¾Ý£¬ÌݶÈ×î´óÖµ²»¿ÉÄܳ¬¹ý1024 int iEdgeNum; //±ß½çµãµÄÊýÁ¿ int iGradMax=0; //±ß½çµãµÄÌݶÈ×î´óÖµ int iHighCount; //¸ù¾ÝiRatioHighСÓÚ¸ßãÐÖµÏñËØµÄ¸öÊý //³õʼ»¯ for(i=0;i<1024;i++) GradHist[i]=0; //ÌݶÈÖ±·½Í¼Í³¼Æ for(i=0;i for(j=0;j if(iEdgePoint[i][j]==128) { GradHist[iExtent[i][j]]++; } } } iEdgeNum=0; //ÕÒ³ö×î´óÌݶȺÍͳ¼Æ±ß½çµãµÄ¸öÊý for(i=0;i<1024;i++) { if(GradHist[i]!=0) iGradMax=i; iEdgeNum+=GradHist[i]; } //»ñµÃСÓÚ¸ßãÐÖµµÄ¸öÊý iHighCount=int(iEdgeNum*dRatioHigh+0.5); k=1; iEdgeNum=GradHist[1]; //Çó³ö¸ßãÐÖµ while((k<=(iGradMax-1))&&(iEdgeNum iEdgeNum+=GradHist[k]; } *iThreHigh=k; //¸ù¾Ý¸ßãÐÖµºÍ±ÈÀý¹ØÏµÇóµÃµÍãÐÖµ *iThreLow=int((*iThreHigh)*dRatioLow+0.5); } void Canny::TraceEdge(int y,int x,int iThreLow,int **iEdgePoint,int **iExtent) { // ¶Ô8ÁÚÓòÏóËØ½øÐвéѯ int xNb[8] = {1, 1, 0,-1,-1,-1, 0, 1} ; int yNb[8] = {0, 1, 1, 1,0 ,-1,-1,-1} ; int yy ; int xx ; int k ; for(k=0;k<8;k++) { yy=y+yNb[k] ; xx=x+xNb[k] ; // Èç¹û¸ÃÏóËØÎª¿ÉÄܵı߽çµã£¬ÓÖûÓд¦Àí¹ý, ²¢ÇÒÌݶȴóÓÚãÐÖµ if(iEdgePoint[yy][xx]==128&&iExtent[yy][xx]>=iThreLow) { // °Ñ¸ÃµãÉèÖóÉΪ±ß½çµã iEdgePoint[yy][xx]=255 ; // ÒԸõãΪÖÐÐĽøÐиú×Ù //TraceEdge(yy,xx,iThreLow,iEdgePoint,iExtent); } } }
Ïà¹ØÍÆ¼ö£º