task FollowEdge(){ if(!isDark()){ panic("Not on an edge!"); wait10Msec(1000); StopAllTasks(); } followingEdge = true; edgeFollow(followingEdge); }
/** Se aplica para determinar los bordes de la imagen. Primero se buscan los valores que esten por encima del thresholdHigh y si es asi se empieza a recorrer en busca de los siguientes puntos que esten por encima del thresholdDown. */ void EdgeDetector::hysteresis(int thresholdHigh, int thresholdsDown) { for(int i = 0; i < height; i++){ for(int j = 0; j < width ; j++){ //QTextStream (stdout) << (edgeNonMaximumSuppression[i][j]/8)<<" \n"; if((edgeNonMaximumSuppression[i][j])>=(double)thresholdHigh){//OJO AQUI CON LA DIVISION edgeFollow(i,j, thresholdsDown); } } } //0 es borde , 1 no es borde }
/** Metodo que sigue un borde. Toma el pixel actual que es mayor al threshold y se toma como un borde. Luego se mueve a la posicion siguiente (90° respecto angulo gradiente contra manecillas reloj). Determina si es mayor por lo menos al thresholdDown y si es asi llama recursivamente a la función. La función para si ya lo hemos visitado o no es mayor al thresholdDown. */ int EdgeDetector::edgeFollow(int posX, int posY, int thresholdsDown) { if(edgeHysteresis[posX][posY]==1){//si no lo visite edgeHysteresis[posX][posY]=0; int degree = gradientDegreeDiscret[posX][posY]; //cout << degree << endl; switch(degree){//mover al siguiente punto 90° respecto angulo gradiente contra manecillas reloj case 0: posY--; posX--; break; case 1: posX-=2; break; case 2: posY++; posX--; break; case 3: posY+=2; break; case 4: posY++; posY++; break; case 5: posX+=2; break; case 6: posX++; posY--; break; case 7: posY-=2; break; } //siguiente punto //OJO CON LA DIVISION if(!(posX<0 || posX>=height) && !(posY<0 || posY>=width) && ((edgeNonMaximumSuppression[posX][posY]) >= (double)thresholdsDown)){//puede interesarme if(edgeFollow(posX, posY,thresholdsDown)){ edgeHysteresis[posX][posY]=0; return 1; } } return 1;//REVISAR el valor siguiente aun no se ha asignado } return 0; }