边缘检测算法 下载本文

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