Вы находитесь на странице: 1из 7

clc, close all

disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp(' SELECCIONAR EL TIPO DE TRANSFORMACIN A REALIZAR ')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('
')
disp('
')
IM = input('Ingresar la imagen entre apstrofes:
');
disp('
')
disp(' 1).Dilatacin ')
disp(' 2).Contraccin ')
disp(' 3).Rotacin ')
disp(' 4).Traslacin ')
disp(' 5).Adicional ')
disp('
')
K = input('Ingresar nmero:
');
if K==1
%OPERACIN DE DILATACIN
disp('
')
h = input('Ingresar el elemento estructural [3x3] entre corchetes:
');
I = imread(IM);
[f,c,n] = size(I);
%obtenemos el tamao de la imagen: filas, columnas y
si es color (n=3) o gris (n=1)
if n==1
Id = zeros( f+2, c+2 );
%creamos una matriz Id completamente de
ceros, pero con dos filas y dos columnas ms.
Id(2:f+1 , 2:c+1 ) = I;
%encajamos la matriz de imagen "I" en el
centro de la matriz de ceros, quedando todo el permetro lleno de ceros.
for i=1:f
%Hacemos un recorrido de la matriz
"Id", por bloques de 3x3.
for j=1:c
%A ese bloque de 3x3 le
multiplicamos el elemento estructurante "h"
IdDD(i,j) = max(max( Id(i:i+2 , j:j+2) .* h ));
%y
tomamos el valor mximo de ese producto.
end
%el resultado lo almacenamos en una nueva matriz IdDD
end
IdDD = uint8(IdDD);
%hacemos la conversin al
formato ENTERO NO SIGNADO
subplot(1,3,1), imshow( I ) , title('Imagen Original')
subplot(1,3,2), imshow( IdDD ) , title('Imagen Dilatada')
subplot(1,3,3), EE=strel('arbitrary',h); M=imdilate(I,EE);
imshow(M), title('Utilizando funcin IMDILATE')
elseif n==3
IdR = zeros( f+2, c+2 );
%Creamos una matriz de ceros, con 2
filas y 2 columnas adicionales al tamao de la matriz de canal ROJO de la imagen
original
IdR(2:f+1 , 2:c+1 ) = I(:,:,1);
%encajamos la matriz de canal
rojo en el centro de la matriz de ceros.
IdG = zeros( f+2, c+2 ); IdG(2:f+1 , 2:c+1 ) = I(:,:,2); %hacemos
lo mismo con el canal VERDE
IdB = zeros( f+2, c+2 ); IdB(2:f+1 , 2:c+1 ) = I(:,:,3);
%y con
el canal AZUL
for i=1:f
for j=1:c
IdRR(i,j) = max(max( IdR(i:i+2 , j:j+2) .* h ));
%Tan igual como se hizo con la imagen de gris
IdGG(i,j) = max(max( IdG(i:i+2 , j:j+2) .* h ));
%se
hace el producto de un bloque de 3x3 de
IdBB(i,j) = max(max( IdB(i:i+2 , j:j+2) .* h ));
%cada canal y se multiplica con el elemento estructurante
end
%y se toma como resultado el valor mximo
de dicho producto. Este producto da como resultado
end
%una nueva matriz de 3x3 pixels.

IdRR = uint8(IdRR);
%se convierte cada canal de color al formato
ENTERO NO SIGNADO
IdGG = uint8(IdGG);
IdBB = uint8(IdBB);
IdRGB = cat(3,IdRR,IdGG,IdBB);
%se concatena o se juntan los tres
canales en una sola variable.
subplot(1,3,1), imshow( I ) , title('Imagen Original')
subplot(1,3,2), imshow( IdRGB ) , title('Imagen Dilatada')
subplot(1,3,3), EE=strel('arbitrary',h); M=imdilate(I,EE);
imshow(M), title('Utilizando funcin IMDILATE')
end
elseif K==2
%OPERACIN DE CONTRACCIN
disp('
')
h = input('Ingresar el elemento estructural [3x3] entre corchetes:
');
I = imread(IM);
[f,c,n] = size(I);
k1 = 1;
if n==1
Ic = 255*ones( f+2, c+2 );
%se forma una matriz con valores
iguales a 255, pero con 2 filas y 2 columnas adicionales al tamao de la imagen
original
Ic(2:f+1 , 2:c+1 ) = I;
%se encaja la matriz de la imagen
original en el centro de la matriz de valores iguales a 255.
for i=1:f
% Esta rutina permite recorrer
toda la imagen Ic por bloques de 3x3.
for j=1:c
GR = Ic(i:i+2 , j:j+2);
%Aqu se guarda el primer,
segundo, ... bloque de 3x3 en GR, temporalmente.
for i1=1:3
%Con este "for"
se recorre el bloque de 3x3 (GR) y se verifica que elemento
for j1=1:3
%coincide con el
valor "1" del elemento estructural definido en "h".
if h(i1,j1)==1,
%Aqu se hace la
verificacin si el elemento de "h" es igual a 1.
V(k1) = GR(i1,j1); %Si es
igual a 1 se construye un vector con el valor de GR.
else
V(k1) = 255;
%Si no es igual
a 1 se construye un vector con un valor grande
end
k1 = k1 + 1;
%Incrementa los
elementos del vector creado "V"
end
end
IdCC(i,j) = min(V);
%Una vez creado el vector
"V" con todos los elementos del bloque 3x3
k1 = 1;
%denominado GR, se
determina el ms pequeo (por tratarse de una
end
%transformacin de CONTRACCIN. Este valor pequeo se almacena
end
% en la matriz
IdCC.
IdCC = uint8(IdCC);
%se cambia al formato ENTERO NO SIGNADO.
subplot(1,3,1), imshow( I ) , title('Imagen Original')
subplot(1,3,2), imshow( IdCC ) , title('Imagen Contrada')
subplot(1,3,3), EE=strel('arbitrary',h); M=imerode(I,EE); imshow(M),
title('Utilizando funcin IMERODE')
elseif n==3
k1 = 1;
IcR = 255*ones( f+2, c+2 ); IcR(2:f+1 , 2:c+1 ) = I(:,:,1);
%Tan
igual que en el caso de la imagen de GRIS
IcG = 255*ones( f+2, c+2 ); IcG(2:f+1 , 2:c+1 ) = I(:,:,2); %PEro
esta vez se realiza sobre cada canal de color

IcB = 255*ones( f+2, c+2 ); IcB(2:f+1 , 2:c+1 ) = I(:,:,3);


%de
forma separada. Es decir, se crea primero la matriz con valores de 255 (pero
incrementa en 2 filas y 2 columnas). Y luego se encaja en el centro la matriz del
canal de color respectivo
for i=1:f
for j=1:c
GR = IcR(i:i+2 , j:j+2); %De igual forma, se toma
una matriz de 3x3 de la imagen analizada, por canal de color
GG = IcG(i:i+2 , j:j+2);
GB = IcB(i:i+2 , j:j+2);
for i1=1:3
%Esa matriz GR, GG o
GB de 3x3, se recorre elemento a elemento comparndola con los elementos de la
for j1=1:3
%matriz elemento
estructural "h". Aquel elemento de GR, GG o GB que coincide con el valor de "1"
de "h", hace que se vaya creando un vector "V1". "V2" o "V3"
if h(i1,j1)==1 %con tales pixeles.
Si no coincide, se coloca en V1, V2 o V3 el valor de 255.
V1(k1) = GR(i1,j1);
%La idea
es obtener el mnimo de los pixeles de ese bloque de 3x3, pero tomando como
referencia
V2(k1) = GG(i1,j1);
%los
valores "1" de la matriz "h".
V3(k1) = GB(i1,j1);
%Esta
operacin se realiza por cada canal de color.
else
V1(k1) = 255; V2(k1) = 255;
V3(k1) = 255;
%Se asigna 255 si no coincide con "1" de la matriz "h"
end
k1 = k1 + 1;
end
end
IcRR(i,j) = min(V1);
%Se toma el valor mniimo de
cada vector V1, V2 y V3
IcGG(i,j) = min(V2);
IcBB(i,j) = min(V3);
k1 = 1;
end
end
IcRR = uint8(IcRR);
IcGG = uint8(IcGG);
IcBB = uint8(IcBB);
%Se convierte a formato ENTERO NO SIGNADO,
por cada canal de color
IcRGB = cat(3,IcRR,IcGG,IcBB); %se concatena los tres canales de
color en una sola variable
subplot(1,3,1), imshow( I ) , title('Imagen Original')
subplot(1,3,2), imshow( IcRGB ) , title('Imagen Contrada')
subplot(1,3,3), EE=strel('arbitrary',h); M=imerode(I,EE); imshow(M),
title('Utilizando funcin IMERODE')
end
elseif K==3
%OPERACIN DE ROTACIN
disp('
')
ANG = input('Ingresar el ngulo de rotacin en grados (con o sin signo):
');
I = imread(IM);
[f,c,n] = size(I);
if n==1
IR =zeros(f,c);
%Se crea una matriz de ceros del mismo tamao de la
imagen original a rotar
for i=0:f-1
%recorre todas las filas y columnas de la imagen
a rotar
for j=0:c-1

x = round( i*cosd( ANG ) - j*sind( ANG ) ); %se


obtiene la nueva posicin para "x" utilizando la frmula segn el ngulo
ingresado
y = round( i*sind( ANG ) + j*cosd( ANG ) ); %se
obtiene la nueva posicin para "y" utilizando la frmula segn el ngulo
ingresado
if x>=0 & y>=0 & x<=f & y<=c
%Se verifica si la
nueva posicin del pixel (x,y) forma parte del tamao de la imagen o no.
IR(x+1,y+1) = I(i+1,j+1);
%si est en el
interior se considera el resultado de la rotacin en la matriz IR. En caso
contrario, se ignora.
end
end
end
subplot(1,2,1), imshow( I ) , title('Imagen Original')
subplot(1,2,2), imshow( IR ) , title('Imagen Rotada')
elseif n==3
IRr =zeros(f,c);
%Lo mismo, pero se hace por cada canal de color.
Para el rojo, verde y azul
IRg =zeros(f,c);
IRb =zeros(f,c);
for i=0:f-1
for j=0:c-1
x = round( i*cosd( ANG ) - j*sind( ANG ) );
%Se
determina la nueva coordenada del pixel a rotar
y = round( i*sind( ANG ) + j*cosd( ANG ) ); %Tanto en
"x" como en "y".
if x>=0 & y>=0 & x<=f & y<=c
%Se verifica si forma
parte del tamao de la imagen
IRr(x+1,y+1) = I(i+1,j+1,1); %en caso de salir
del tamao se ignora.
IRg(x+1,y+1) = I(i+1,j+1,2);
IRb(x+1,y+1) = I(i+1,j+1,3);
end
end
end
IRr = medfilt2(IRr);
%Cuando se realiza una
operacin de rotacin existen muchos pixeles de la matriz inicial de CEROS que no
fueron ocupados por los pixeles de la imagen
IRg = medfilt2(IRg);
%Original. Por lo tanto, la
imagen rotada queda muchas veces con "huecos" (pixeles negros en el fondo).
Entonces, se hace necesario realizar una operacin
IRb = medfilt2(IRb);
%de filtrado para llenar esos
huecos. Para ello, se opta por el filtro de mediana, pero aplicado a cada canal
de color.
IR = cat(3,IRr,IRg,IRb);
%Se concatena los tres canales en
una sola variable.
IR = uint8(IR);
%Se convierte a formato ENTERO
NO SIGNADO
subplot(1,2,1), imshow( I ) , title('Imagen Original')
subplot(1,2,2), imshow( IR ) , title('Imagen Rotada')
end
elseif K==4
%OPERACIN DE TRASLACIN
disp('
')
HO = input('Ingresar el desplazamiento HORIZONTAL (POS: derecha / NEG:
izquierda):
');
VE = input('Ingresar el desplazamiento VERTICAL (POS: abajo / NEG: arriba):
');
I = imread(IM);
[f,c,n] = size(I);

if HO>c, disp('No es posible desplazar HORIZONTALMENTE (excede al tamao de


la imagen)'); end %si se ingresa un valor de desplazamiento que excede al tamao
de la imagen original se muestra un mensaje de advertencia
if VE>f, disp('No es posible desplazar VERTICALMENTE (excede al tamao de
la imagen)'); end
if n==1
IT = zeros( f , c ); %se crea una matriz IT de ceros y del mismo
tamao de la imagen original a desplazar
for i=0:f-1
%se recorre todas las filas y columnas de la imagen a
desplazar.
for j=0:c-1
if HO>0 & VE>0
%Cdigo para el caso que el
desplazamiento es positivo para horizontal y vertical
x = i + HO;
%se aplica la frmula de sumar la
fila con el desplazamiento horizontal
y = j + VE;
%se aplica la frmula de sumar la
columna con el desplazamiento vertical
if x>=0 & y>=0 & x<=f & y<=c
%se verifica si
est dentro del tamao de la imagen
IT(x+1,y+1) = I(i+1,j+1);
%en caso
contrario se ignora la nueva ubicacin del pixel.
end
elseif HO<0 & VE<0
%Cdigo para el caso que el
desplazamiento es negativo para horizontal y vertical
x = i + HO + f;
%se aplica la frmula de sumar
la fila con el desplazamiento horizontal y complementado con el tamao de filas
y = j + VE + c;
%se aplica la frmula de sumar
la columna con el desplazamiento vertical y complementado con el tamao de
columnas
if x>=0 & y>=0 & x<=f & y<=c %se verifica si
est dentro del tamao de la imageny se considera esa nueva ubicacin.
IT(x+1,y+1) = I(i+1,j+1);
%en caso
contrario se ignora la nueva ubicacin del pixel.
end
end
end
end
IT = uint8(IT);
%Se convierte al formato entero no signado
subplot(1,2,1), imshow( I ) , title('Imagen Original')
subplot(1,2,2), imshow( IT ) , title('Imagen Trasladada')
elseif n==3
ITr =zeros(f,c);%se crea una matriz IT de ceros y del mismo tamao de
la imagen original a desplazar
ITg =zeros(f,c);%pero por cada canal de color
ITb =zeros(f,c);
if HO>=0 & VE>=0 %Cdigo para el caso que el desplazamiento es
positivo para horizontal y vertical
for i=0:f-1
for j=0:c-1
x = i + VE; %se aplica la frmula de sumar la fila con
el desplazamiento horizontal
y = j + HO;%se aplica la frmula de sumar la columna
con el desplazamiento vertical
if x>=0 & y>=0 & x<=f & y<=c %se verifica si est
dentro del tamao de la imagen y se considera esa nueva ubicacin.
ITr(x+1,y+1) = I(i+1,j+1,1); %en caso contrario
se ignora la nueva ubicacin del pixel.
ITg(x+1,y+1) = I(i+1,j+1,2); %esta operacin se
realiza por cada canal de color.
ITb(x+1,y+1) = I(i+1,j+1,3);
end
end

negativo

positivo

negativo

color en

end
elseif HO<0 & VE>=0 %Cdigo para el caso que el desplazamiento es
para horizontal y positivo para vertical
for i=0:f-1
for j=c-1:-1:0
x = i + VE;
y = j + HO;
if x>=0 & y>=0 & x<=f & y<=c
ITr(x+1,y+1) = I(i+1,j+1,1);
ITg(x+1,y+1) = I(i+1,j+1,2);
ITb(x+1,y+1) = I(i+1,j+1,3);
end
end
end
elseif HO>=0 & VE<0 %Cdigo para el caso que el desplazamiento es
para horizontal y negativo para vertical
for i=f-1:-1:0
for j=0:c-1
x = i + VE;
y = j + HO;
if x>=0 & y>=0 & x<=f & y<=c
ITr(x+1,y+1) = I(i+1,j+1,1);
ITg(x+1,y+1) = I(i+1,j+1,2);
ITb(x+1,y+1) = I(i+1,j+1,3);
end
end
end
elseif HO<0 & VE<0 %Cdigo para el caso que el desplazamiento es
para horizontal y negativo para vertical
for i=f-1:-1:0
for j=c-1:-1:0
x = i + VE;
y = j + HO;
if x>=0 & y>=0 & x<=f & y<=c
ITr(x+1,y+1) = I(i+1,j+1,1);
ITg(x+1,y+1) = I(i+1,j+1,2);
ITb(x+1,y+1) = I(i+1,j+1,3);
end
end
end
end
IT = cat(3,ITr,ITg,ITb);
%se concatena las tres imgenes de
una sola variable.
IT = uint8(IT);
%se convierte a formato entero no

signado
subplot(1,2,1), imshow( I ) , title('Imagen Original')
subplot(1,2,2), imshow( IT ) , title('Imagen Trasladada')
end
elseif K==5
%OPERACIN DE SUMA CON UN COMPLEJO
disp('
')
a = input('Ingresar la parte real: "z = a + b i ":
'); %se almacena en
"a" la parte real de la variable compleja
b = input('Ingresar la parte imaginaria de: "z = a + b i " :
'); %se
almacena en "b" la parte imaginaria de la variable compleja
z = a + b*i;
%se forma el complejo en "z"
z1 = 1/z;
%se obtiene la inversa del complejo
z2 = 1/z/z; %se obtiene la inversa del cuadrado del complejo
z3 = 1/(z+1); %se obtiene la inversa de la suma del complejo con 1.
I = imread(IM);
[f,c,n] = size( I );
if n==1
%para una imagen de gris

I1 = double( I ) + z1 * ones(f,c);
%se suma la imagen original con
una matriz conformada por complejos del mismo valor (correspondiente a la inversa
z1)
I1 = abs( I1 );
%se obtiene el mdulo del resultado de la
suma
I1 = uint8( I1 ); %se convierte a formato entero no
signado
I2 = double( I ) + z2 * ones(f,c);
I2 = abs( I2 );
I2 =
uint8( I2 );
%lo mismo para las otras operaciones
I3 = double( I ) + z3 * ones(f,c);
I3 = abs( I3 );
I3 =
uint8( I3 );
%de inversa del complejo al cuadrado e inversa del complejo mas 1.
subplot(2,2,1), image( I ), title('Imagen Original')
subplot(2,2,2), image( I1 ), title('Imagen + 1/z ')
subplot(2,2,3), image( I2 ), title('Imagen + 1/z^2 ')
subplot(2,2,4), image( I3 ), title('Imagen + 1/(z+1) ')
elseif n==3
%para color
I1r = double( I(:,:,1) ) + z1 * ones(f,c);
I1r = abs( I1r );
I1r = uint8( I1r ); %se realiza el mismo procedimiento pero por cada canal de
color
I1g = double( I(:,:,2) ) + z1 * ones(f,c);
I1g = abs( I1g );
I1g = uint8( I1g ); %se suma a la imagen original una matriz de complejos iguales
I1b = double( I(:,:,3) ) + z1 * ones(f,c);
I1b = abs( I1b );
I1b = uint8( I1b ); %se obtiene el mdulo y se convierte a formato entero no
signado
I2r =
I2r = uint8( I2r
I2g =
I2g = uint8( I2g
I2b =
I2b = uint8( I2b

double(
); %lo
double(
);
double(
);

I3r =
I3r = uint8( I3r
I3g =
I3g = uint8( I3g
I3b =
I3b = uint8( I3b

double( I(:,:,1) ) + z3 * ones(f,c);


);
double( I(:,:,2) ) + z3 * ones(f,c);
);
double( I(:,:,3) ) + z3 * ones(f,c);
);

I1
cada canal de
I2
I3

I(:,:,1) ) + z2 * ones(f,c);
I2r = abs( I2r );
mismo para el canal rojo, verde y azul
I(:,:,2) ) + z2 * ones(f,c);
I2g = abs( I2g );
I(:,:,3) ) + z2 * ones(f,c);

end

I3r = abs( I3r );


I3g = abs( I3g );
I3b = abs( I3b );

= cat(3,I1r,I1g,I1b);
I1 = uint8(I1); %se concatena
color en una sola variable y se convierte a entero no signado
= cat(3,I2r,I2g,I2b);
I2 = uint8(I2);
= cat(3,I3r,I3g,I3b);
I3 = uint8(I3);

subplot(2,2,1),
subplot(2,2,2),
subplot(2,2,3),
subplot(2,2,4),
end

I2b = abs( I2b );

image(
image(
image(
image(

I ), title('Imagen Original')
I1 ), title('Imagen + 1/z ')
I2 ), title('Imagen + 1/z^2 ')
I3 ), title('Imagen + 1/(z+1) ')

Вам также может понравиться