Anuncios Google

Problemas aplicando un filtro Sobel

Buenas!

Veréis estoy intentando aplicar un filtro sobel a una imagen cargada en memoria, pero no consigo que funciones (lo de aplicar el filtro Sobel es para después convertir la imagen a lo Andy Warhol)

 

Aquí os pongo en el único formato que puedo trabajar (no puedo usar tiles, ojo)

// Configuramos el modo gráfico
REG_DISPCNT = MODE_5_2D | DISPLAY_BG2_ACTIVE;
VRAM_A_CR = VRAM_ENABLE | VRAM_A_MAIN_BG;
BGCTRL[2] = BG_BMP_BASE(0) | BgSize_B8_256x256;
 

Y aquí la función que realiza todo el trabajo:

// convertir = 1 -> aplicarle el filtro sobel
// convertir = n -> quitarle el filtro sobel
void imagenSobel(u8* bmp, u16* paleta, int longitud, int convertir) {
	int i, j;
	int x, y;
	u8 p1, p2, p3, p4, p6, p7, p8, p9, linea[256];
	u8 R, G, B, gris;
	u16* aux = (u16*)malloc(longitud/2);
 
	for(i = 0; i < longitud/2; i++) {
		R = paleta[i] & 0x1F;
		G = (paleta[i] >> 5) & 0x1F;
		B = (paleta[i] >> 10) & 0x1F;
		gris = div32(30*R, 100) + div32(59*G, 100) + div32(11*B, 100);
		paleta[i] = RGB15(gris, gris, gris);
	}
 
	if(convertir == 1) {
		for(i = 0; i < 256; i++) {
			for(j = 0; j < 256; j++) {
				p1 = (i-1)*256+(j-1); 	        // (x-1, y-1)
				p2 = (i-1)*256+j;		// (x, y-1)      -------------- 
				p3 = (i-1)*256+(j+1); 	// (x+1, y-1)  | p1  p2  p3 |
				p4 = i*256+(j-1);		// (x-1, y)      | p4 |p5| p6|
				p6 = i*256+(j+1);		// (x+1, y)     | p7  p8  p9 |
				p7 = (i+1)*256+(j-1); 	// (x-1, y+1)  --------------
				p8 = (i+1)*256+j;		// (x, y+1)
				p9 = (i+1)*256+(j+1); 	// (x+1, y+1)
 
				x = (p1+(p2+p2)+p3-p7-(p8+p8)-p9);
				y = (p3+(p6+p6)+p9-p1-(p4+p4)-p7);
				aux[i*256 + j] = sqrt((x*x) + (y*y));
			}
		}
	}
 
	for(i = 0; i < 256; i++) {
		paleta[i] = aux[i];
	}
}

Y ésta es la fórmula que utilizo para aplicar el filtro sobel:

nuevo_valor_pixel_p5 = SQRT((X*X) + (Y*Y))
X = (p1+(p2+p2)+p3-p7-(p8+p8)-p9)
Y = (p3+(p6+p6)+p9-p1-(p4+p4)-p7)
 

Primero convierto la imagen a escala de grises cosa que hace de forma correcta, y luego le intento aplicar el filtro sobel pero no hay tu tía :S

A ver si podéis echarme una mano.

Un saludo!

 


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de kNightFox

Lo has intentado en modo 16

Lo has intentado en modo 16 bits? Asi no tienes que estar pendiene de la paleta, si no de cada pixel.

Imagen de Puyover

Lo siento pero tampoco puedo.

Lo siento pero tampoco puedo. Si por mi fuera lo haría en framebuffer que es mas simple, pero me exigen ese modo y no puedo cambiarlo :S

Imagen de kNightFox

Es que me da que hacerlo en

Es que me da que hacerlo en 256 colores te va a amargar, pro que si tienes que calcular el valor de cada pixel y su paleta, te puedes divertir. YO decia que lo probaras en frame buffer, si funciona es que le problema esta en el uso de paletas y ese filtro.


Nuestra web oficial:
http://www.nightfoxandco.com/
 
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
 
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.

 

Imagen de Puyover

Mmm buena idea, probaré esta

Mmm buena idea, probaré esta tarde en modo framebuffer a ver si al menos funciona el filtro.

 

Un saludo.

Imagen de kNightFox

De todos modos si vas a usar

De todos modos si vas a usar escala de grises, como mucho podras usar valores 0 al 31. Lo mas practico seria crearte una paleta de 32 colores con todos los tonos de grises, y calcular el valor de cada pixel en base 32. Asi con la paleta predefinida, sera practicamente como hacerlo en modo framebuffer.


Nuestra web oficial:
http://www.nightfoxandco.com/
 
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
 
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.

 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.