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!
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.
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
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.
Mmm buena idea, probaré esta
Mmm buena idea, probaré esta tarde en modo framebuffer a ver si al menos funciona el filtro.
Un saludo.
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.