Sei sulla pagina 1di 2

1.

Procedimientos para convertir una imagen en matriz y viceversa (Prctica 1) a

Ejercicio 1.1. El siguiente procedimiento de Maple lee un chero bmp con una imagen en blanco y negro (guardada como imagen de 24 bits) y convierte la imagen en una matriz. El ancho de la imagen ha de ser un mltiplo de 4. Tiene por argumentos: u imagen = nombre del chero que contiene la imagen. alto = altura de la imagen (en pixels). ancho = anchura de la imagen (en pixels). ImagenaMatrizAncho4x:=proc(imagen,alto,ancho) local filename,fd,im,im2,Mat: filename:=convert(imagen.bmp,string); fd:=fopen(filename,READ,BINARY): im:=readbytes(fd,54); im:=readbytes(fd,100000); im2:=[seq(seq(1-im[3*ancho*(alto-j)+3*i]/255,i=1..ancho),j=1..alto)]; Mat:=linalg[matrix](alto,ancho,im2); end:

> > > > > > > > >

Se pide: a 1. Modicarlo para obtener un procedimiento ImagenaMatriz que funcione con imgenes de cualquier anchura. 2. Modicarlo para obtener un procedimiento ImagenaMatriz que funcione con imgenes a de cualquier anchura y para el que no se necesite introducir las dimensiones de la imagen. a 3. Modicarlo para obtener un procedimiento ImagenaMatriz que funcione con imgenes de cualquier anchura y guardadas en cualquier formato bmp (monocromo, 16 colores, 256 colores o 24 bits) y para el que no se necesite introducir las dimensiones de la imagen (opcional). Ejercicio 1.2. El siguiente procedimiento de Maple rodea una matriz M con un marco de 0s. > Mborde0s:=proc(M) > local r,s,Mborde,i,j: > r:=linalg[rowdim](M): > s:=linalg[coldim](M): > Mborde:=linalg[matrix](r+2,s+2,0): > for i from 1 to r do: > for j from 1 to s do: > Mborde[i+1,j+1]:=M[i,j]; > od: > od: > Mborde; > end: Modicarlo para obtener otro procedimiento Mborde1s que sirva para rodear una matriz con un marco de 1s.

Ejercicio 1.3. El siguiente procedimiento de Maple pinta la imagen asociada a una matriz M. > MatrizaImagen:=proc(M) > local Imagen0,r,s,i,j: > r:=linalg[rowdim](M): > s:=linalg[coldim](M): > Imagen0:=[]: > for i from 1 to r do: > for j from 1 to s do: > if M[i,j]=1 then > Imagen0:=[op(Imagen0),plottools[rectangle]([j,-i],[j+1,-i-1],color=black)]: > fi: > od: > od: > print(plots[display](Imagen0,scaling=constrained,axes=none)); > end: Se pide: 1. Utilizarlo, en conjuncin con el procedimiento Imagenamatriz, con imgenes de difeo a rente tamao, para comprobar cmo funciona. n o 2. Estudiar cmo se podr mejorar. o a Ejercicio 1.4. El siguiente procedimiento de Maple pinta la imagen asociada a una matriz M con valores en [0, 1] como una imagen en tonos de grises (de forma que 1 corresponde al color negro y 0 al color blanco). > MatrizaImagenGrises:=proc(M) > local Imagen0,r,s,i,j: > r:=linalg[rowdim](M): > s:=linalg[coldim](M): > Imagen0:=[]: > for i from 1 to r do: > for j from 1 to s do: > if M[i,j]>0 then > Imagen0:=[op(Imagen0),plottools[rectangle]([j,-i],[j+1,-i-1], > color=COLOR(RGB,1-M[i,j],1-M[i,j],1-M[i,j]))]: > fi: > od: > od: > print(plots[display](Imagen0,scaling=constrained,axes=none)); > end: Se pide: Modicarlo para obtener otro procedimiento MatrizaImagenVariosColores que pinte la imagen asociada a una matriz M con valores en N de forma que a cada nmero le corresponda u un color distinto. Indicacin: Basta reemplazar el modicador color=COLOR(RGB,1-M[i,j],1-M[i,j],1-M[i,j])por o olor=COLOR(HUE,(c-M[i,j])/c)), donde c corresponde a la mayor de las entradas de la mac triz M.

Potrebbero piacerti anche