dividir una matriz en submatrices y hallar media

eeert
29 de Octubre del 2008
Hola, necesito dad una matriz, subdividirla en subregiones de tamaño kxk y hallar la media de cada una de esas subregiones. "k" será un valor introducido por el usuario. Es para pixelar una imagen... y no lo consigo. A ver si alguien me puede hechar una mano o darme una pista. Gracias por adelantado

Alejandro
29 de Octubre del 2008
Hola eeert
Te digo a continuación cómo lo haría yo con un ejemplo. Imagina que tienes declarada una matriz de enteros de dimensiones 8 filas x 4 columnas. Lo que quieres se limita a recorrer la matriz con u "salto" diferente. En lugar de hacerlo de casilla en casilla lo haces pero deteniéndote en las casillas que te interesan ¿cómo hacer esto? Deberías saber el "salto", que en este caso es k. Imaginemos que en este caso k=2. Esto quiere decir que dividimos la matriz de 8x4 en 4x2 porciones de 4x4, de la forma:

01 23 45 67
+--+--+--+--+
0|xx|xx|xx|xx|
1|xx|xx|xx|xx|
+--+--+--+--+
2|xx|xx|xx|xx|
3|xx|xx|xx|xx|
+--+--+--+--+

La matriz se recorrería originalmente así:

for(i=0;i<8;i++ {
for(j=0;j<4;j++) {
....

Ahora la tienes que recorrer así.

for(i=0; i<4; i++) {
for(j=0;j<2;j++) {

Sabemos que el maximo i es 4 y el maximo j e 2 porque sabemos que k es 2 y dividimos los máximos originales (i=8, j=4):

Cuando i vale 0, te detienes en la columna 0, cuando vale 1 en la 2, y así sucesivamente. Eso se plasma de la forma:

for(i=0; i<4; i++) {
for(j=0;j<2;j++) {

ni = i*2; nj = j*2; //Posición que quieres

//Realiza la media
media = (matriz[ni][nj] + matriz[ni+1][nj] + matriz[ni][nj+1] +
matriz[ni+1][nj+1]) / 4;

//Rellena las casillas con la media (pixelación)
matriz[ni][nj] = media;
matriz[ni+1][nj] = media;
matriz[ni][nj+1] = media;
matriz[ni+1][nj+1] = media;
}
}

Espero haberte ayudado, la explicación es rápida y quizá tenga unos cuantos errores, pero creo que se entiende. Éste es un caso particular, pero para hacerlo más general habría que modificar al código en pocos sitios. Ya me cuentas o pregúntame si tienes dudas. Un saludo.