Exemple #1
0
int main()
{
	Pila<int> pila;
	Pila<int> pila2;

	pila.Apilar(1);
	pila.Apilar(2);
	pila.Apilar(3);
	pila.Apilar(4);
	pila.Apilar(5);
	pila.Apilar(6);

	pila2.Apilar(7);
	pila2.Apilar(8);

	//Invertirmos la pila
	//pila.ConcatenarPila(pila2);

	//pila.ImprimirPila();
	//pila.ImprimirPila();

	pila.InvertirPila();
	pila.ImprimirPila();
}
void doubleThresholding_c (
	unsigned char *src,
	int cantFilas,
	int cantColumnas,
	int src_row_size
) {
	int i;
	int j;
	Pila laPila;
	int abc;
	int ord;
	unsigned char *pos;
	

	vector<bool> aux(cantColumnas, true);
	vector< vector<bool> > porRevisar(cantFilas, aux);
	
	for(j = 0; j < cantColumnas; ++j){
		porRevisar[0][j] = false; // Primer fila
		porRevisar[cantFilas-1][j] = false; // Última fila
	}
	for(i = 1; i < cantFilas-1; ++i){
		porRevisar[i][0] = false; // Primer columna
		porRevisar[i][cantColumnas-1] = false; // Última columna
	}

	/// Operación con los píxeles
	for(i = 1 ; i < cantFilas-1 ; i++){
		for(j = 1 ; j < cantColumnas-1 ; j++){
			pos = src + i*src_row_size + j;									/// pos guarda la posición en la que uno está iterando
			if ( porRevisar[i][j] && *pos == 0 ) porRevisar[i][j] = false; /// Si no fue revisado y es nulo lo marca como revisado
			else if( porRevisar[i][j] && *pos == 200 ){ 	/// Si aún no fue revisado y es píxel fuerte
				/// Chequea todos los píxeles vecinos, si son débiles los pone en la pila para procesarlos luego
				/*	1 2 3 */
				/*	4 X 6 */
				/*	7 8 9 */
				
				if( *(pos - src_row_size - 1) 	== 100 ) laPila.Apilar(i-1, j-1);	/// Apila el pixel de la pos 1
				if( *(pos - src_row_size) 		== 100 ) laPila.Apilar(i-1, j);		/// Apila el pixel de la pos 2
				if( *(pos - src_row_size + 1) 	== 100 ) laPila.Apilar(i-1, j+1);	/// Apila el pixel de la pos 3
				if( *(pos - 1)					== 100 ) laPila.Apilar(i, j-1);		/// Apila el pixel de la pos 4
				if( *(pos + 1)					== 100 ) laPila.Apilar(i, j+1);		/// Apila el pixel de la pos 6
				if( *(pos + src_row_size - 1)	== 100 ) laPila.Apilar(i+1, j-1);	/// Apila el pixel de la pos 7
				if( *(pos + src_row_size)		== 100 ) laPila.Apilar(i+1, j);		/// Apila el pixel de la pos 8
				if( *(pos + src_row_size + 1)	== 100 ) laPila.Apilar(i+1, j+1);	/// Apila el pixel de la pos 9
				
				porRevisar[i][j] = false;										/// Al fuerte lo marca como revisado
				
				while( !laPila.EsVacia() ){		/// Mientras la pila no sea vacía opera todos los puntos
					abc = laPila.AbcisaTope();
					ord = laPila.OrdenadaTope();
					pos = src + abc*src_row_size + ord;
					laPila.SacarTope();											/// Saca al par ordenado ya operado

					if(porRevisar[abc][ord]){
						
						*pos = 200;					/// Pinta fuerte al píxel	
			
						/// Revisa los vecinos y todos los débiles los agrega a la pila
						if( *(pos - src_row_size - 1) 	== 100 ) laPila.Apilar(abc-1, ord-1);
						if( *(pos - src_row_size) 		== 100 ) laPila.Apilar(abc-1, ord);
						if( *(pos - src_row_size + 1) 	== 100 ) laPila.Apilar(abc-1, ord+1);
						if( *(pos - 1)					== 100 ) laPila.Apilar(abc, ord-1);
						if( *(pos + 1)					== 100 ) laPila.Apilar(abc, ord+1);
						if( *(pos + src_row_size - 1)	== 100 ) laPila.Apilar(abc+1, ord-1);
						if( *(pos + src_row_size)		== 100 ) laPila.Apilar(abc+1, ord);
						if( *(pos + src_row_size + 1)	== 100 ) laPila.Apilar(abc+1, ord+1);
						
						porRevisar[abc][ord] = false;							/// Lo marca como revisado
					}
				}
			}
		}
	}
	
	
	/// Por último, anula todos los débiles que sobrevivieron
	for(i = 1 ; i < cantFilas-1 ; i++){
		for(j = 1 ; j < cantColumnas-1 ; j++){
			if( *(src + i*src_row_size + j) == 100 ) *(src + i*src_row_size + j) = 0;
		}
	}
}