• Lunes 23 de Diciembre de 2024, 03:23

Autor Tema:  Dibujar intensidades en una matriz  (Leído 3889 veces)

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Dibujar intensidades en una matriz
« en: Sábado 28 de Marzo de 2009, 16:26 »
0
Bueno, Tengo una duda bastante importante...

 A ver si me explico bien, yo tengo una tabla con coordenadas x e y,  y un valor corresponediente. Lo que quiero es crear una matriz de tamaño maximo el valor que tengo como "x"  e "y", y en cada coordenada poner el valor correspondiente para luego hacer una grafica de colores, donde unos colores representen los colores mas altos y otros los mas bajos. Ademas en algunas coordenadas no tendre valores , con lo que dejare esas a cero:

 Un ejemplo

 x  y  valor
 
 1 1   5
 2 1   4
 3 4   2
 4 4   4

 Entonces quiero crear una matriz:

     5  0  0  0
     4  0  0  0
     0  0  0  2
     0  0  0  4

 Y luego dibujarla, dando diferentes colores segun el valor que tenga cada componente de la matriz.

 A alguien se le ocurre como poder hacer???

 Muchisimas gracias por todo, Saludos!!!

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dibujar intensidades en una matriz
« Respuesta #1 en: Lunes 30 de Marzo de 2009, 06:21 »
0
¿Eh? :wacko:

Cita de: "Estrufi"
Tengo una duda bastante importante...
Un paso muy importante para resolver un problema es definirlo correctamente...

Cita de: "Estrufi"
donde unos colores representen los colores mas altos y otros los mas bajos.
Supongo que será valores.

Bueno, según lo que entendí, lo que harías es crear una matriz de ceros de xmax * ymax, donde la vas llenando de acuerdo a los valores de la tabla que tienes. No mencionas de dónde proviene dicha tabla, imagino que será de un archivo, siendo así, creo que no deberías tener muchos problemas para cargar la tabla pues ya has trabajado leyendo/guardando archivos en cierto formato (por otras dudas que has colocado en el foro).

En cuanto a "dibujar la matriz", dependiendo del tamaño de la matriz, podrías representar cada posición en la misma como un cuadrado, de forma que toda la matriz asemejara un tablero de ajedrez, donde cada casilla corresponda con una posición de la matriz. Para ello crearías una imagen del tamaño que desees (si fuera muy trande podría ser un pixel por cada posición de la matriz, si fuera muy pequeña podrías definir de cuántos pixeles hacer cada cuadro), luego recorres la imagen (no es más que una matriz de colores) modificando los valores según corresponda.

Suerte.
La imaginación es el límite.
Hardware & Software | Mexchip

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Re: Dibujar intensidades en una matriz
« Respuesta #2 en: Martes 31 de Marzo de 2009, 00:12 »
0
Buenas!!

  Pero se te ocurre alguna manera de ir metiendo en cada coordenada ese valor correspondiente? porque tengo bastante dificultad a la hora de crear esa matriz. Efectivamente cada punto de la matriz se corresponde con un pixel de la imagen, y se podria decir que quiero representar diferentes intensidades dependiendo del valor que tome cada punto de la matriz, por ejemplo los valores a 0 que sean blancos, entre 1 y 2 verdes, etc....

 Muchisimas gracias!!!! Saludos!

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Re: Dibujar intensidades en una matriz
« Respuesta #3 en: Martes 31 de Marzo de 2009, 00:13 »
0
Buenas!!

  Pero se te ocurre alguna manera de ir metiendo en cada coordenada ese valor correspondiente? porque tengo bastante dificultad a la hora de crear esa matriz. Efectivamente cada punto de la matriz se corresponde con un pixel de la imagen, y se podria decir que quiero representar diferentes intensidades dependiendo del valor que tome cada punto de la matriz, por ejemplo los valores a 0 que sean blancos, entre 1 y 2 verdes, etc....

 Muchisimas gracias!!!! Saludos!

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dibujar intensidades en una matriz
« Respuesta #4 en: Martes 31 de Marzo de 2009, 20:35 »
0
Una imagen es una matriz de filas * columnas * 3 (si la imagen es a color), son 3 elementos pues cada pixel se compone por 3 componentes: rojo, verde y azul. Este código crea una matriz; luego un vector donde se guardan los colores que corresponden a cada valor de la matriz, en la posición 1 del vector se tiene el color para el valor 1, en la posición 2 el color para el valor 2, etc. Finalmente, se crea una imagen de las mismas dimensiones que la matriz, se recorre y en cada pixel se coloca el color que se saca del vector de colores.

Espero le entiendas, si quisieras hacerlo por intervalos (de x a y valor que sea el mismo color), puedes hacerlo con sentencias if dentro del ciclo que recorre la imagen.
Código: Matlab M
  1. %% Limpieza
  2.  
  3. % matriz de valores
  4. matriz = [ 5 0 0 0; 4 0 0 1; 0 0 0 2; 0 1 0 4 ];
  5. % dimensiones de la matriz
  6. filas = 4;
  7. columnas = 4;
  8.  
  9. % cuántos colores
  10. max_color = 6;
  11.  
  12. % vector de colores
  13. % la posición 1 corresponde al color para la cantidad 1,
  14. % la posición 2 al color para la cantidad 2...
  15. % tiene max_color elementos por 3, para guardar las componentes rojo, verde
  16. % y azul de cada color
  17. colores = zeros( max_color, 3 );
  18.  
  19. %% Asignación de colores
  20. % llenamos los colores, para cada elemento tenemos 3 componentes: rojo,
  21. % verde y azul
  22.  
  23. % Elemento 1, rojo
  24. colores( 1, 1 ) = 255;
  25. colores( 1, 2 ) = 0;    % se puede eliminar, pues ya vale cero
  26. colores( 1, 3 ) = 0;    % se puede eliminar, pues ya vale cero
  27. % Elemento 2, verde
  28. colores( 2, 1 ) = 0;    % se puede eliminar, pues ya vale cero
  29. colores( 2, 2 ) = 255;
  30. colores( 2, 3 ) = 0;    % se puede eliminar, pues ya vale cero
  31. % elemento 3, azul
  32. colores( 3, 1 ) = 0;    % se puede eliminar, pues ya vale cero
  33. colores( 3, 2 ) = 0;    % se puede eliminar, ya vale cero
  34. colores( 3, 3 ) = 255;
  35. % elemento 4, amarillo
  36. colores( 4, 1 ) = 255;
  37. colores( 4, 2 ) = 255;
  38. % elemento 5, morado
  39. colores( 5, 1 ) = 128;
  40. colores( 5, 3 ) = 128;
  41.  
  42. %% Imagen
  43. % la imagen es una matriz de filas x columnas x 3 componentes de cada pixel
  44. % se convierte a uint8 pues cada componente del pixel es de ese tipo (byte)
  45. imagen = uint8( zeros( filas, columnas, 3 ) );
  46.  
  47. %% Dibujado
  48. % recorre la matriz por filas y columnas, colocando el color adecuado
  49. % en la imagen
  50. for f = 1 : filas
  51.     for c = 1 : columnas
  52.         valor = matriz( f, c );
  53.         if ( valor ~= 0 )
  54.             imagen( f, c, 1 ) = colores( valor, 1 );
  55.             imagen( f, c, 2 ) = colores( valor, 2 );
  56.             imagen( f, c, 3 ) = colores( valor, 3 );
  57.         end
  58.     end
  59. end
  60.  
  61. imshow( imagen );
  62.  

Suerte.
La imaginación es el límite.
Hardware & Software | Mexchip

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Re: Dibujar intensidades en una matriz
« Respuesta #5 en: Martes 31 de Marzo de 2009, 21:56 »
0
Hola!!

 Muchas gracias por el ejemplo, lo entiendo mas o menos, pero lo que realmente me preocupa es crear la matriz, en el ejemplo he usado una 4x4, y una mini tabla, pero en realidad tendre una matriz de muchos mas elementos pork mi tabla es mucho mas grande tb, y deberia crear un bucle para poder asignarle a cada coordenada un valor...ya que directamente seria imposible.

 Se te ocurre algo? Muchas gracias!!

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dibujar intensidades en una matriz
« Respuesta #6 en: Miércoles 1 de Abril de 2009, 05:33 »
0
Supongo que te refieres a la asignación de colores.

Se me ocurren dos opciones: una, usar valores aleatorios; en lugar de asignar directamente los colores para cada valor, haces un ciclo que genere colores aleatorios y que verifique que no haya repetidos. Segunda, poner los colores en función de los valores de la matriz, por ejemplo, que para el valor 200 tengas valores de componentes mayores que 200, o alguna operación que derive la intensidad de componentes a partir de ese valor.
La imaginación es el límite.
Hardware & Software | Mexchip

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Re: Dibujar intensidades en una matriz
« Respuesta #7 en: Miércoles 1 de Abril de 2009, 13:09 »
0
Buenas!!!

   Antes de nada, muchas gracias por tu tiempo como siempre.... a mi la duda k se me plantea antes de nada, ya no es asignar los colores , etc, etc,, sino como teniendo las 3 columnas: x, y, valor.. hago para crear esa matriz de ceros en las coordenadas donde no tenga ningun valor y asignarle valor en las coordenadas que si lo tengo:

   en plan:

  x y    valor
  5 10  7
  5 22  8
  5 50  20
  10 30  10
  etc.etc...

  Pork deberia crear una especie de bucle,no??? o ir leyendo de alguna manera las x y las y, no???

 Muchisimas gracias!! saludos!!

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Re: Dibujar intensidades en una matriz
« Respuesta #8 en: Miércoles 1 de Abril de 2009, 17:07 »
0
Hola!!

  Me esta saliendo un error tal que asi:

  ??? Attempted to access colores(15,1); index out of bounds because size(colores)=[6,3].

Error in ==> visualizar_desplazamiento at 128
            imagen( f, c, 1 ) = colores( valor, 1 );

Y la verdad no tengo muy claro de que va.

 Graciñas!!

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dibujar intensidades en una matriz
« Respuesta #9 en: Jueves 2 de Abril de 2009, 01:12 »
0
Es porque se usan los índices del vector de colores como el color para cada valor, entonces, si tienes en la matriz un valor 15, se buscará el índice 15 del vector de colores. Por ello, deberías modificar max_color para que corresponda con el máximo valor que tienes en la matriz.
La imaginación es el límite.
Hardware & Software | Mexchip

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Re: Dibujar intensidades en una matriz
« Respuesta #10 en: Jueves 2 de Abril de 2009, 09:55 »
0
buenas!

 He conseguido crear la matriz con los valores, ahora a ver si soy capaz de asignar colores, que te parece el comando "mesh", no se si me podría ser util para lo que quier hacer.

  Saludos y mil gracias.

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Re: Dibujar intensidades en una matriz
« Respuesta #11 en: Jueves 2 de Abril de 2009, 13:16 »
0
Holaaaa!!!

 vuelvo a tener una duda, me han contestado esto acerca de los ejemplos para crear la matriz que he puesto mas arriba:

 Depende de si el cero de las y está en la parte de arriba o en la deabajo de la pantalla.
Si x=0, y=0 (columna=1 fila=1 en la matriz) es la esquina inferior izquierda de la pantalla, sería: 0 0 2 4
                                                                                                                                             0 0 0 0
                                                                                                                                             0 0 0 0
                                                                                                                                              5 4 0 0
Si el origen está enla parte superior izquierda: 5 4 0 0
                                                                     0 0 0 0
                                                                     0 0 0 0
                                                                     0 0 2 4
 Como se donde tengo el origen en la pantalla???? image, imshow, plot..., como dibujan una matriz que les estoy pasando, colocando el primer elemento en la parte inferior izquierda de la pantalla (me refiero al elemento (1,1)de la matriz que se encuentra en la parte superior izquierda) o colocando ese mismo elemento en la parte superior izquierda de la pantalla, con lo que cada pixel se correspondería exactamente con su elemento de la matriz??

 Me explico más ó menos o me he hecho mucho lio??

 Muchisimas gracias k ando un poco desesperada con ese tema...

 Saludos!!!

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dibujar intensidades en una matriz
« Respuesta #12 en: Jueves 2 de Abril de 2009, 20:03 »
0
Empiezan por la esquina superior izquierda.

El comando mesh hace algo similar a lo que quieres, con la particularidad de que además del color, grafica los valores de la matriz como una altura. Eso también puedes hacerlo con el comando surf, o incluso con plot3. Si puedes usarlo, te facilitaría mucho :).
La imaginación es el límite.
Hardware & Software | Mexchip

Estrufi

  • Miembro MUY activo
  • ***
  • Mensajes: 158
    • Ver Perfil
Re: Dibujar intensidades en una matriz
« Respuesta #13 en: Jueves 2 de Abril de 2009, 22:38 »
0
Buenas!!

 Entonces los ejes de la grafica irian de arriba a abajo y de izquierda a derecha,no? pero haciendo axis ij ó axis xy, cambio los valores donde comienzan los ejes para que el primer valor este situado en la parte inferior a la izquierda???

 Muchisimas gracias!