sábado, 8 de marzo de 2014

Crear imágenes con degradado (Lineal y Radial)


Será ésta la primera entrada del blog orientada al procesamiento de imágenes, por lo cual es aún muy básica.

Vamos a crear cuatro tipo de degradados (lineal de derecha a izquierda, lineal de izquierda a derecha, radial de adentro hacia afuera y radial de afuera hacia adentro) en imágenes en escala de grises, utilizando ciclos for simples y anidados.

Lineal de derecha izquierda

Definimos primeramente las variables ancho y alto que determinarán el tamaño de la imagen. Con el ciclo for creamos la matriz A, agregando cada elemento de ella en una ejecución, como puede observarse la variación de valores se da sólo en una dirección. Recuerde que el tipo de dato comúnmente utilizado en imágenes es el uint8 (entero sin signo de 8 bits) y por ello debe hacerse la conversión explícita dado que MATLAB por defecto considera como tipo double cualquier valor numérico introducido. Se especifica que el valor tomado debe ser ancho-i para que mientras i aumenta el valor decrezca. Tome en cuenta que los valores próximos a 0 tienden a ser negros y que entre más próximos a 255 serán en un tono más claro o blanco. Finalmente, la instrucción imshow permite mostrar la imagen en una ventana.

ancho = 250;
alto = 250;
for i=1:ancho
    A(1:alto,i)=uint8(ancho-i);
end
imshow(A);



Lineal de izquierda a derecha


ancho = 250;
for i=1:ancho
    A(1:alto,i)=uint8(i);
end
imshow(A);




Radial de adentro hacia afuera

Como en el caso lineal se definen las variables ancho y alto, pero ahora se necesitarán dos ciclos for anidados dado que la variación será en ambas direcciones. El punto de referencia no será ninguno de los extremos, sino el punto medio dado por $ ancho/2 $ y $ alto/2 $. La variación del valor asignado depende de la variable "distr", que es la distancia desde el punto medio a cada uno de los puntos o pixeles que componen la imagen, o en términos más amables:

$$ \sqrt{(ancho/2\,-\,i)^2+(alto/2\,-\,j)^2} $$

ancho = 250;
alto = 250;
for i=1:ancho
    for j=1:alto
        distr = sqrt((ancho/2-i)^2+(alto/2-j)^2);
        A(j,i)=uint8(distr);
    end
end
imshow(A);



Radial de afuera hacia adentro


ancho = 250;
alto = 250;
for i=1:ancho
    for j=1:alto
        distr = sqrt((ancho/2-i)^2+(alto/2-j)^2);
        A(j,i)=uint8(0.5*ancho-distr);
    end
end
imshow(A);





2 comentarios:

  1. hola, tengo una duda. si quisiera que en vez de que sea un color negro, que se vea una imagen, como lo podria hacer ??

    ResponderBorrar
  2. oye, si supiste cómo hacerlo?

    ResponderBorrar