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); } } }