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);





miércoles, 5 de marzo de 2014

Conversor de temperaturas







Esta interfaz gráfica permite obtener la conversión entre cuatro de las escalas de temperatura más usuales (Celsius, Kelvin, Farenheit, Rankine). Para ello debe introducir un valor en uno de los campos de texto y pulsar el botón Convertir. Si se introducen datos en más de un campo el programa establece un orden preferencial dado por la sentencia de control if-elseif que comienza en la línea 46.

Hasta la línea 38 se crean todos los elementos gráficos que componen la GUI, estableciendo las características y ubicación en la ventana para cada uno. La función convertir está asociada al callback del Push Button Convertir; en las primeras cuatro líneas de código de la función anterior (41-44)  se lee mediante la propiedad String, el valor que se ha introducido en cada uno de los Edit Text, nótese que se hace referencia a los campos editables utilizando el handle obtenido previamente. La sentencia de control if-elseif tiene como función verificar el campo de texto en el cual se ha introducido un dato, comenzando de arriba hacia abajo, es decir que si todos los campos están rellenos el programa tomará el valor introducido en los grados centígrados.


1
function converTemperatura
2
% Conversor de temperatura
3
% Última modificación: 03/01/14
4
% Jorge De Los Santos
5
% delossantosmfq@gmail.com && matlabtyp@gmail.com
6
% Blog: http://matlab-typ.blogspot.com
7

8
fcolor=[0.92 0.92 0.92];
9
figure('NumberTitle','off','MenuBar','none','color',fcolor,...
10
    'Name','Conversor de Temperatura','position',[200 200 150 200],...
11
    'resize','off');
12
centerfig(gcf);
13

14
% Grados Celsius
15
uicontrol('Style','text','String','°C','Position',[110 170 20 20],...
16
    'BackgroundColor',fcolor,'FontSize',10,'FontWeight','b');
17
gC=uicontrol('Style','edit','String','','Position',[20 170 80 20]);
18

19
% Grados Kelvin
20
uicontrol('Style','text','String','K','Position',[110 135 20 20],...
21
    'BackgroundColor',fcolor,'FontSize',10,'FontWeight','b');
22
gK=uicontrol('Style','edit','String','','Position',[20 135 80 20]);
23

24
% Grados Fahrenheit
25
uicontrol('Style','text','String','°F','Position',[110 100 20 20],...
26
    'BackgroundColor',fcolor,'FontSize',10,'FontWeight','b');
27
gF=uicontrol('Style','edit','String','','Position',[20 100 80 20]);
28

29
% Grados Rankine
30
uicontrol('Style','text','String','R','Position',[110 65 20 20],...
31
    'BackgroundColor',fcolor,'FontSize',10,'FontWeight','b');
32
gR=uicontrol('Style','edit','String','','Position',[20 65 80 20]);
33

34
uicontrol('Style','Pushbutton','String','Convertir','FontSize',9,...
35
    'FontWeight','b','Position',[10 20 70 25],'callback',@convertir);
36

37
uicontrol('Style','Pushbutton','String','Borrar','FontSize',9,...
38
    'FontWeight','b','Position',[90 20 50 25],'callback',@borrar);
39

40
    function convertir(src,event)
41
        C=get(gC,'String');
42
        K=get(gK,'String');
43
        F=get(gF,'String');
44
        R=get(gR,'String');
45
       
46
        if ~strcmp(C,'')
47
            C=str2double(C);
48
            K=C+273.15;
49
            F=(9/5)*C+32;
50
            R=(C+273.15)*(9/5);
51
        elseif ~strcmp(K,'')
52
            K=str2double(K);
53
            C=K-273.15;
54
            F=(9/5)*K-459.67;
55
            R=(9/5)*K;
56
        elseif ~strcmp(F,'')
57
            F=str2double(F);
58
            C=(F-32)*(5/9);
59
            K=(F+459.67)*(5/9);
60
            R=F+459.67;
61
        elseif ~strcmp(R,'')
62
            R=str2double(R);
63
            C=(R-491.67)*(5/9);
64
            K=(5/9)*R;
65
            F=R-459.67;
66
        else
67
            warndlg('Inserte un valor en al menos un campo','Error');
68
        end
69
       
70
        set(gC,'String',num2str(C));
71
        set(gK,'String',num2str(K));
72
        set(gF,'String',num2str(F));
73
        set(gR,'String',num2str(R));
74
    end
75

76
    function borrar(src,event)
77
        set(findobj('style','edit'),'str','');
78
    end
79
end