Convolución de una Imágen en Escala de Grises con GNU Octave
En este post vamos a ver el desarrollo de un proceso para poder obtener los contornos en una imagen en GNU Octave.
Primero, vamos a obtener la imagen original, y si no está en escala de grises, vamos a usar la funcion rgb2gray() para convertir la imagen.
imagen = imread(‘/home/analuz/Imágenes/OctaveIcon.jpg’);
imagen_gris = rgb2gray(imagen);
imagen_gris=double(imagen_gris);
Asignamos a unas variables los valores de las dimensiones de la matriz de la imagen.
[renglones, columnas, t] = size(imagen_gris);
En el siguiente algoritmo se utiliza una mascara que se va a encargar de definir contornos que aparezcan en la imagen de forma horizontal o casi horizontal.
imagen_horizontal = zeros(renglones, columnas);
for i=1:renglones-2
for j=1:columnas-2
for k=i:i+2
for l=j:j+2
if(k==i), imagen_horizontal(i+1, j+1) = imagen_horizontal(i+1, j+1) + (imagen_gris(k,l)*-1);
end
if(k==i+1), imagen_horizontal(i+1, j+1) = imagen_horizontal(i+1, j+1) + (imagen_gris(k,l)*0);
end
if(k==i+2), imagen_horizontal(i+1, j+1) = imagen_horizontal(i+1, j+1) + (imagen_gris(k,l)*1);
end
end
end
end
end
En éste otro algoritmo se utiliza una mascara que ahora define contornos de la imagen de forma vertical o casi vertical.
imagen_vertical = zeros(renglones, columnas);
for i=1:renglones-2
for j=1:columnas-2
for k=i: i+2
for l=j: j+2
if(l==j), imagen_vertical(i+1, j+1) = imagen_vertical(i+1, j+1) + (imagen_gris(k,l)*-1);
end
if(l==j+1), imagen_vertical(i+1, j+1) = imagen_vertical(i+1, j+1) + (imagen_gris(k,l)*0);
end
if(l==j+2), imagen_vertical(i+1, j+1) = imagen_vertical(i+1, j+1) + (imagen_gris(k,l)*1);
end
end
end
end
end
Las anteriores se procesan para obtener en el resultado un mejor contorno de la imagen, haciendo uso del gradiente a través del siguiente algoritmo:
imagen_gradiente = zeros(renglones, columnas);
for i=1:renglones-2
for j=1:columnas-2
imagen_gradiente(i,j) = sqrt(( imagen_horizontal(i, j)^2)+(imagen_vertical(i, j)^2));
end
end
Obtenido lo anterior, procedemos a convertir los elementos de las matrices en enteros de 8 bits (256 niveles de gris).
imagen_gris=uint8(imagen_gris);
imagen_horizontal=uint8(imagen_horizontal);
imagen_vertical=uint8(imagen_vertical);
imagen_gradiente=uint8(imagen_gradiente);
Por último, en las siguiente instrucciones se ordena plasmar los resultados de cada proceso que hicimos:
figure,subplot(1,4,1),imshow(imagen_gris),title(‘Imagen gris’);
subplot(1,4,2),imshow(imagen_horizontal),title(‘Imagen horizontal’);
subplot(1,4,3),imshow(imagen_vertical),title(‘Imagen vertical’);
subplot(1,4,4),imshow(imagen_gradiente),title(‘Imagen gradiente’);
El resultado final de todo lo anterior, es la ventana que aparece en la siguiente imagen.
Primero, vamos a obtener la imagen original, y si no está en escala de grises, vamos a usar la funcion rgb2gray() para convertir la imagen.
imagen = imread(‘/home/analuz/Imágenes/OctaveIcon.jpg’);
imagen_gris = rgb2gray(imagen);
imagen_gris=double(imagen_gris);
Asignamos a unas variables los valores de las dimensiones de la matriz de la imagen.
[renglones, columnas, t] = size(imagen_gris);
En el siguiente algoritmo se utiliza una mascara que se va a encargar de definir contornos que aparezcan en la imagen de forma horizontal o casi horizontal.
imagen_horizontal = zeros(renglones, columnas);
for i=1:renglones-2
for j=1:columnas-2
for k=i:i+2
for l=j:j+2
if(k==i), imagen_horizontal(i+1, j+1) = imagen_horizontal(i+1, j+1) + (imagen_gris(k,l)*-1);
end
if(k==i+1), imagen_horizontal(i+1, j+1) = imagen_horizontal(i+1, j+1) + (imagen_gris(k,l)*0);
end
if(k==i+2), imagen_horizontal(i+1, j+1) = imagen_horizontal(i+1, j+1) + (imagen_gris(k,l)*1);
end
end
end
end
end
En éste otro algoritmo se utiliza una mascara que ahora define contornos de la imagen de forma vertical o casi vertical.
imagen_vertical = zeros(renglones, columnas);
for i=1:renglones-2
for j=1:columnas-2
for k=i: i+2
for l=j: j+2
if(l==j), imagen_vertical(i+1, j+1) = imagen_vertical(i+1, j+1) + (imagen_gris(k,l)*-1);
end
if(l==j+1), imagen_vertical(i+1, j+1) = imagen_vertical(i+1, j+1) + (imagen_gris(k,l)*0);
end
if(l==j+2), imagen_vertical(i+1, j+1) = imagen_vertical(i+1, j+1) + (imagen_gris(k,l)*1);
end
end
end
end
end
Las anteriores se procesan para obtener en el resultado un mejor contorno de la imagen, haciendo uso del gradiente a través del siguiente algoritmo:
imagen_gradiente = zeros(renglones, columnas);
for i=1:renglones-2
for j=1:columnas-2
imagen_gradiente(i,j) = sqrt(( imagen_horizontal(i, j)^2)+(imagen_vertical(i, j)^2));
end
end
Obtenido lo anterior, procedemos a convertir los elementos de las matrices en enteros de 8 bits (256 niveles de gris).
imagen_gris=uint8(imagen_gris);
imagen_horizontal=uint8(imagen_horizontal);
imagen_vertical=uint8(imagen_vertical);
imagen_gradiente=uint8(imagen_gradiente);
Por último, en las siguiente instrucciones se ordena plasmar los resultados de cada proceso que hicimos:
figure,subplot(1,4,1),imshow(imagen_gris),title(‘Imagen gris’);
subplot(1,4,2),imshow(imagen_horizontal),title(‘Imagen horizontal’);
subplot(1,4,3),imshow(imagen_vertical),title(‘Imagen vertical’);
subplot(1,4,4),imshow(imagen_gradiente),title(‘Imagen gradiente’);
El resultado final de todo lo anterior, es la ventana que aparece en la siguiente imagen.

Comentarios
Publicar un comentario