Operaciones Morfológicas

En esta ocasión se realizó el análisis de 4 imágenes a través de operaciones morfológicas tales como erosión, dilatación, apertura y cierre y se determinó cual de éstas es la óptima para obtener la forma más parecida al objeto mostrado.
Como primer paso luego de escoger las imágenes correspondientes a trabajar, se obtuvieron en escala de grises utilizando la función rgb2gray del software Matlab, donde siempre hemos trabajado. El código utilizado fue el siguiente e inmediatamente se encuentra el resultado obtenido.


%% Conversión a escala de grises
figure(1)
img1=rgb2gray(avion);
subplot(221),imshow(img1),title('Imagen 1')
img2=rgb2gray(alce);
subplot(222),imshow(img2),title('Imagen 2')
img3=rgb2gray(baseball);
subplot(223),imshow(img3),title('Imagen 3')
img4=rgb2gray(cangaroo);
subplot(224),imshow(img4),title('Imagen 4')



Luego se procede a hacer el análisis de cada una de las imágenes para determinar cual de ls 4 operaciones nos permite visualizar mejor la forma de la misma. Para esto se utilizó la función SE=strel(‘diamond’,R), la cual crea un objeto plano donde la estructuración es en forma de rombo y la letra R permite especificar la distancia del origel del elemento estructurador a los puntos del diamante. Este número debe ser positivo.
En el primer caso luego de saber esto, procedemos a utilizar dicha función con R=3, ya que después de varias pruebas se cofirmó que era el valor más óptimo. Vemos a continuación cuales fueron los resultados obtenidos para cada operación.


Como podemos ver, las operaciones de erosión y apertura nos muestran una imagen más elaborada que la original, sin embargo entre estas dos, la imagen obtenida utilizando la operación de erosión tiene mejor apariencia que las demás, por lo tanto, se concluye que en este caso es la operación ideal para obtener la forma de la imagen.
El código utilizado se muestra a continuación.

%% Análisis de img1 (avion)

sel = strel('diamond',3);
im_d=imdilate(img1,sel);

figure(2)
subplot(231)
imshow(img1)
title('Original')

subplot(232)
imshow(im_d)
title('Dilatación usando Strel. diamante.')


im_e = imerode(img1,sel);
subplot(233)
imshow(im_e)
title('Erosión usando Stel. diamante.')

im_ap = imdilate(imerode(img1,sel),sel);
subplot(234)
imshow(im_ap)
title('Apertura usando Strel diamante.')

im_cr = imerode(imdilate(img1, sel),sel);
subplot(235)
imshow(im_cr)
title('Cierre usando Strel. diamante')


Para el segundo caso la imagen seleccionada fue la que tiene forma de alce. En este caso se procede como en el anterior, escogiendo un valor de R óptimo tal que la forma de la imagen se realce y distinga mucho mejor. Luego de varias pruebas se concluyo que dicho valor es R=2. Los resultados obtenidos se pueden ver en la siguiente imagen.



Como podemos ver nuevamente las operaciones de apertura y erosión nos muestran una mejor visualización de la figura de la imagen original, sin embargo, podríamos decir que la operación de cierre también hace un buen intento por mostrar un contorno adecuado. En este caso se elige la operación de apertura por optimizar de una mejor forma la imagen original.
El código utilizado en este caso lo visualizamos en breve.

%% Análisis de img2 (alce)

sel = strel('diamond',2);
im_d=imdilate(img2,sel);

figure(3)
subplot(231)
imshow(img2)
title('Original')

subplot(232)
imshow(im_d)
title('Dilatación usando Strel. diamante.')


im_e = imerode(img2,sel);
subplot(233)
imshow(im_e)
title('Erosión usando Stel. diamante.')

im_ap = imdilate(imerode(img2,sel),sel);
subplot(234)
imshow(im_ap)
title('Apertura usando Strel diamante.')

im_cr = imerode(imdilate(img2, sel),sel);
subplot(235)
imshow(im_cr)
title('Cierre usando Strel. diamante')

Como tercer caso, la imagen escogida fue la correspondiente al chico jugando baseball. Luego de realizar las mismas operaciones que en los casos anteriores y hacer análisis similares y correspondientes, se llegó a la conclusión de que en este caso el valor óptimo de R en este caso debería corresponder nuevamente a 2. Los resultados a continuación.



Vemos que indudablemente en este caso las operaciones de dilatación y cierre hacen un mejor trabajo que las otras dos, e indudablemente se elige como mejor caso la de cierre ya que recrea de manera fiel la forma que se pretende alcanzar del jugador.
El código se muestra a continuación.

%% Análisis de img3 (baseball)

sel = strel('diamond',2);
im_d=imdilate(img3,sel);

figure(4)
subplot(231)
imshow(img3)
title('Original')

subplot(232)
imshow(im_d)
title('Dilatación usando Strel. diamante.')


im_e = imerode(img3,sel);
subplot(233)
imshow(im_e)
title('Erosión usando Stel. diamante.')

im_ap = imdilate(imerode(img3,sel),sel);
subplot(234)
imshow(im_ap)
title('Apertura usando Strel diamante.')

im_cr = imerode(imdilate(img3, sel),sel);
subplot(235)
imshow(im_cr)
title('Cierre usando Strel. diamante')

Como última imagen tenemos la forma de un canguro. Y luego de varias pruebas se determinó que el valor de R adecuado para este caso debería ser de 1, ya que de esta forma las operaciones dilatación y cierre nos muestran unos resultados muy buenos, en comparación con las de erosión y apertura si aumentamos R, no iguala a la optimización que se logra con este valor y estas operaciones. Veamos a continuación los resultados.



Tal y como se mencionó se comprueba que ambas operaciones nos brindan los mejores resultados por lo que se puede elegir cualquiera de las dos en este caso.
El código utilizado se muestra a continuación.
%% Análisis de img4 (cangaroo)

sel = strel('diamond',1);
im_d=imdilate(img4,sel);

figure(5)
subplot(231)
imshow(img4)
title('Original')

subplot(232)
imshow(im_d)
title('Dilatación usando Strel. diamante.')

im_e = imerode(img4,sel);
subplot(233)
imshow(im_e)
title('Erosión usando Stel. diamante.')

im_ap = imdilate(imerode(img4,sel),sel);
subplot(234)
imshow(im_ap)
title('Apertura usando Strel diamante.')

im_cr = imerode(imdilate(img4, sel),sel);
subplot(235)
imshow(im_cr)
title('Cierre usando Strel. diamante')


Para concluir se puede decir que las operaciones morfológicas nos permite encontrar la forma de un objeto dependiendo de este y la operación a realizar. Muchas veces es mejor utilizar algunas en comparación con otras, o algunas veces simplemente podemos utilizar varias ya que nos brindan resultados similares e igual de valiosos. También se puede hacer uso de todas para comparar, eliminar errores, o redundancias en una imagen.

Read Users' Comments (1)comentarios

Operaciones Orientadas al Punto

En esta ocasión les traigo un trabajo realizado sobre operaciones orientadas al punto en 4 imágenes diferentes, vemos como estas son mejoradas, en todos los casos las imágenes fueron convertidas a escalas de grises para trabajarlas mejor con el software Matlab.

I. Conversión a gris

El primer paso fue convertir la imagen de la izquierda a escala de grises utilizando el comando rgb2gray por lo que la imagen obtenida fue la que se puede observar al lado derecho. Veamos

Imágen 1

img1_gris=rgb2gray(img1);

imshow(img1_gris);









Imagen2
img2_gris=rgb2gray(img2);
imshow(img2_gris);






Imagen3

img3_gris=rgb3gray(img3);
imshow(img3_gris);








Imágen 4

img4_gris=rgb2gray(img4);

imshow(img4_gris);











II. Obtención del Histograma de la Imagen Original.

Con el comando “imhist” se obtuvo el histograma de cada una de las imágenes vistas anteriormente en escala de grises. Éstos se pueden apreciar a continuación.

Imágen 1

Imágen 2

Imágen 3

Imágen 4

III. Operación de corrección

Para aplicar una operación de corrección orientada al punto se usó el comando “imadjust” el cual es muy sencillo de usar teniendo en cuenta que los parámetros de éste son Contraste, Brillo y Gamma respectivamente.

Imágen 1

En ésta imagen se puede ver que el histograma original se encuentra parcialmente bien distribuído, ya que tiene componentes en aproximadamente todos los niveles. Sin embargo, como vemos los tonos blancos sobresalen en el histograma mientras que los negros están ausentes. Debido a esto se coloca el Gamma en 1.05 lo cual hace que nuestra imagen se oscurezca un poco distribuyendo de una mejor manera algunas de éstas componentes. Por otra parte, El brillo fue afectado levemente [0.001 0.95] al igual que el contraste, [0.01 0.98], ya que éste binariza la imagen y lo que se pretendía era visualizar mejor los detalles, variando los tonos

Luego de escribir el código:

%% Imágen 1

img1_gris=rgb2gray(img1);

subplot(221),imshow(img1_gris);

subplot(222),imhist(img1_gris);

img1_histo=imadjust(img1_gris,[0.1 0.98],[0.001 0.95],1.05);

subplot(223),imshow(img1_histo);

subplot(224),imhist(img1_histo);

Obtenemos la imágen procesada

Imágen 2

En este segundo caso la imagen debía ser aclarada drásticamente, ya que los niveles de negros y en general, tonos oscuros eran muy altos, destacándose poco los tonos claros, por lo que se modificó el gamma a 0.7 logrando así que se vieran mucho mejores los detalles inapreciables anteriormente.

Por otra parte, se agregó algo de brillo],[0.01 0.99], el cual se pudo apreciar en el histograma, ya que éste se corre a la derecha proporcionando así una mejor distribución de los colores haciéndolos más agradables a la vista. Por último se hizo la corrección de contraste,[0.02 0.95], el cual fue muy ligero, pero sin embargo necesario para apreciar detalles que brinda esta herramienta.

Código:

%% Imágen 2

img2_gris=rgb2gray(img2);

subplot(221),imshow(img2_gris);

subplot(222),imhist(img2_gris);

img2_histo=imadjust(img2_gris,[0.02 0.95],[0.01 0.99],0.6);

subplot(223),imshow(img2_histo);

subplot(224),imhist(img2_histo);

Imágen procesada:

Imágen 3

Como se puede observar ésta imágen tiene prácticamente todas sus componentes del lado derecho del histograma, es decir, que para mejorar notablemente la fotografía se debe hacer una corrección gamma considerable que distribuya de manera más equitativa las componentes por todo el histograma. Es por esto que éste valor de gamma se escogió como 4.5, el cual oscurece en gran medida la imágen sin que se pierdan detalles importantes.

Se le aplicó a la imagen sólo un poco de brillo ya que el ajuste gamma ayudó a la visualización correcta de ésta.

No fue necesario seguir ajustando la imagen ya que se obtuvo un buen resultado sin modificar el contraste de ésta. Por lo que ese parámetro no se modificó.

Código:

%% Imágen 3

img3_gris=rgb2gray(img3);

subplot(221),imshow(img3_gris);

subplot(222),imhist(img3_gris);

img3_histo=imadjust(img3_gris,[],[0.001 0.98],4.5);

subplot(223),imshow(img3_histo);

subplot(224),imhist(img3_histo);

Imágen 4

Ésta última fotografía presenta muchas componentes en los niveles oscuros, por lo que requería un ajuste de gamma que permitiera aclarar la imagen. Éste ajuste fue de 0.5, y así se pudieron apreciar instantáneamente detalles que antes resultaban imposibles para el ojo humano.

A pesar de éste ajuste se necesitó agregarle brillo a la imagen de tal forma que el histograma se hiciera un poco más uniforme corriéndose un poco hacia la derecha y haciendo que la imagen se aclarase un poco más para observar los detalles.

Nuevamente no se necesitó corrección de contraste, ya que ésta propiedad binariza la imagen y no permite que se aprecien detalles los cuales pueden ser observados desactivándola.

Código:

%% Imágen 4

img4_gris=rgb2gray(img4);

subplot(221),imshow(img4_gris);

subplot(222),imhist(img4_gris);

img4_histo=imadjust(img4_gris,[],[0.12 0.95],0.5);

subplot(223),imshow(img4_histo);

subplot(224),imhist(img4_histo);

Imágen procesada

Read Users' Comments (0)

Laplaciano de Gaussiano

Hola a todos!!!

Esta vez les traigo un breve ejemplo de como sacar bordes de imágenes a escala de grises con el software Matlab.

Espero les sirva de ayuda!!!

Utilizando la imagen mostrada a continuación se pretende visualizar el efecto que tiene aplicar filtros LoG (Laplacian of Gaussian) en ésta y de qué forma afecta el valor de la desviación


Como en los casos anteriores se trabaja la imagen en una dimensión a escala de grises, esto se logra utilizando la función rgb2gray como se muestra a continuación en el código.

ben=rgb2gray(ben2);

imshow(ben);

Utilizando la función “edge” se puede especificar el método Laplaciano de Gaussiano. Ésta función está diseñada para utilizar el parámetro sigma como la desviación estándar del filtro LoG.



La función indica que el valor estándar o por defecto es 2, sin embargo se hicieron pruebas desde un valor sigma de 0.1 y el resultado aplicando este último fue la siguiente imagen.

El código utilizado para todas las imágenes se presenta a continuación:

BW1 = edge(ben,'log',thresh,sigma);

imshow(BW1);

Al irse variando el valor de sigma y haciéndolo mayor la definición de borde se hacía menos visible y por lo tanto la imagen se ve menos detallada que como en el caso mostrado.


Con un sigma de 1 ya se pueden ver las diferencias, no hay tantos detalles visibles como en los casos anteriores, al seguir elevando este valor a 2, el cual es llamado valor estándar, vemos que los detalles son los justos y necesarios para apreciar la figura mostrada, se podría decir que es un valor en el cual para mayores de este la imagen es poco fiel y para menores a este hay información suficiente y de sobra. Comprobamos esto con un valor sigma de 5 en el cual la imagen es casi que irreconocible en cuanto a sus bordes, y al seguir aumentando estos continuarán desapareciendo hasta hacerlo completamente en el valor máximo de 10.

A continuación vemos 3 de las imágenes anteriormente mencionadas con los valores respectivos de sigma de 1, 2 y 5


Cabe señalar que la función edge tiene otro parámetro llamado “thresh” el cual al ser activado con valores muy pequeños es capaz de equilibrar la falta de detalles que elimina el sigma cuando se eleva. Veamos las siguientes mismas imágenes pero esta vez con un valor de thresh de 0.00001.


Read Users' Comments (0)

Chistes para ingenieros

ir arriba