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)

Filtros de Suavizado

Hola a todos ^^

Aquí les traigo un trabajo que hice acerca de filtros de suavizado con ayuda del software maltab para la asignatura de Procesamiento Digital de Imágenes. La imagen utilizada fue Lenna!!

Bueno sin más interrupciones aquí se los dejo, espero sus comentarios !!!

El filtrado es un tipo de operación que altera el valor de un píxel en función de los valores de los píxeles que le rodean, es por ello que a este tipo de procesamiento de la imagen también se le denomina procesamiento basado en la vecindad u operación de vecindad.[1]

Para comprobar los filtros de suavizado se seleccionó una imagen, en este caso "Lenna" la cual observamos a continuación a color del lado izquierdo y en escala de grises al lado derecho:









Esta última imagen se obtuvo con la función rgb2gray, utilizando las siguientes líneas de comando.

lena_gris=rgb2gray(lena);

imshow(lena_gris);

Luego de esto se le añadió a esta imagen ruido de dos clases, “Sal y Pimienta” y “Gaussiano” con el fin de realizar un filtrado de promedio y un filtrado de promedio ponderado utilizando un kernel gaussiano, cada uno de estos con 2 clases de máscaras diferentes. Estos ruidos los trabajaremos por separado a continuación:

Ruido de Sal y Pimienta

Para obtener la imagen con el ruido de sal y pimienta se utilizó la función imnoise, como se muestra a continuación en las líneas de código:

salpi = imnoise(lena_gris,'salt & pepper',0.15);

imshow(salpi);

psnrsalpi=PSNR(lena_gris,salpi);

La imagen distorsionada debido a este ruido se muestra a seguir:

Como podemos ver si hubo una distorsión bastante pronunciada sobre la imagen, este ruido se añade con el último parámetro de la función imnoise, el cual en este caso se usó de 0.15 siendo su mínimo valor 0 y su máximo valor 1 distorsionando 100% la imagen con el ruido de sal y pimienta.

Como se puede observar en el código se halló el psnr entre la imagen distorsionada y la original el cual fue de 31.0995

Cabe señalar que todos los filtrados se hicieron con la función fspecial, que en el caso del filtro de promedio sólo había que especificar de cuanto se quería que fuese la máscara, en este caso se utilizaron 2. Una de 4x4 y otra de 7x7.

Para comenzar con el filtrado de la imagen en este tipo de ruido se utilizó la función imfilter en donde los parámetros son el filtro y la imagen dañada que se desea filtrar.

En cada caso se hizo un análisis de la PSNR con una función previamente establecida, teniendo en cuenta la imagen original, con la imagen filtrada. Cabe señalar, que entre mayor sea éste valor mejor será el filtrado de la imagen. Teniendo esto en cuenta se procede a mostrar cada uno de los resultados obtenidos al aplicar cada uno de los filtros en la imagen de Lena con ruido de sal y pimienta.

En la imagen de la izquierda la máscara fue de 4x4 y al filtrarla, se obtuvo un psnr de 52.9580 mientras que en la derecha fue de 7x7 con un valor de psnr de 55.6161 como podemos ver la segunda imagen es mucho mejor que la primera ya que su valor de psnr es mayor, esto nos indica que la máscara de 7x7 hace mejor el trabajo de filtrado de ruido.









A continuación los códigos de ambas imágenes respectivamente:

filprom1 = fspecial('average', [4 4]);

mesh(filprom1);

imfilt1=imfilter(salpi,filprom1,'replicate');

imshow(imfilt1);

psnr1=PSNR(lena_gris,imfilt1);


filprom2 = fspecial('average', [7 7]);

mesh(filprom2);

imfilt2=imfilter(salpi,filprom2,'replicate');

imshow(imfilt2);

psnr2=PSNR(lena_gris,imfilt2);

En el caso del filtro gaussiano, se utilizó la misma función fspecial, pero esta vez se le agregó un parámetro, la varianza. Dicha varianza permite establecer el tamaño de la máscara que se adecua mejor para hacer un filtrado óptimo. En éste caso se utilizó varianza de 5 y 10 cuyas máscaras fueron de 31x31 y de 61x61 respectivamente. Cabe señalar que para la escogencia del tamaño de éstas máscaras se siguió un patrón que permite que el filtro sea mucho más óptimo. El cual se basa en la formula de σ*6+1. A continuación se muestran los dos filtros mencionados anteriormente.







Utilizando el mismo método anterior se hallaron las psnr de cada una de las imágenes y sus valores fueron 53.3276 para la máscara de 31x31 y de 53.2343 para la máscara de 61x61. Por lo que se puede deducir que el primer caso fue más óptimo que el segundo. A continuación las imágenes.









Los códigos utilizados para obtener estas imágenes se encuentran a continuación respectivamente:

filgaus1=fspecial('gaussian',[31 31],5);

mesh(filgaus1);

imfilt3=imfilter(salpi,filgaus1,'replicate');

imshow(imfilt3);

psnr3=PSNR(lena_gris,imfilt3);


filgaus2=fspecial('gaussian',[61 61],10);

mesh(filgaus2);

imfilt4=imfilter(salpi,filgaus2,'replicate');

imshow(imfilt4);

psnr4=PSNR(lena_gris,imfilt4);

Como conclusión ante el ruido de sal y pimienta se puede ver que es mucho mejor utilizar un filtro de promedio ya que éste nos brinda una mayor psnr además que la imagen obtenida es mucho más nítida.

Ruido Gaussiano

Para añadir esta clase de ruido a la imagen se utilizó de igual forma la función imnoise, simplemente que cambiaron los parámetros de ésta, como vemos a continuación en el código:

gau = imnoise(lena_gris,'gaussian',0,0.05);

imshow(gau);

psnrgau=PSNR(lena_gris,gau);

Como se puede ver, se halló el psnr entre la imagen distorsionada y la original y este fue de 31.7154.

La imagen distorsionada por el ruido gaussiano se muestra a continuación.


Al igual que en el caso del ruido de sal y pimienta, en este caso se aplicaron filtros de promedio y filtro de promedio ponderado utilizando un kernel gaussiano. En el primer caso se utilizaron dos máscaras una de 6x6 y otra de 7x7 con el fin de filtrar la imagen y luego calcular su psnr. En el caso de la máscara de 6x6 el psnr fue de 57.4173 y en el caso de la máscara de 7x7 fue de 57.9369.

A continuaciñon se pueden ver las imágenes en sus posiciones respectivas después de filtrarlas como se mencionó anteriormente.









El código utilizado para la obtención de las imágenes anteriores se encuentra a continuación:

filprom3=fspecial('average',[6 6]);

mesh(filprom3);

imfilt5=imfilter(gau,filprom3,'replicate');

imshow(imfilt5);

psnr5=PSNR(lena_gris,imfilt5);


filprom4=fspecial('average',[7 7]);

mesh(filprom4);

imfilt6=imfilter(gau,filprom4,'replicate');

imshow(imfilt6);

psnr6=PSNR(lena_gris,imfilt6);


En el caso del filtro de promedio ponderado utilizando un kernel gaussiano se siguó la misma fórmula mencionada en el caso del ruido de sal y pimienta, sin embargo en este caso se utilizaron varianzas igual a 2 y 3 lo cual produjo máscaras de 13x13 y 19x19. A continuación se encuentran los filtros utilizados respectivamente.







Las imágenes obtenidas respectivamente luego de aplicarles la función del filtro son las siguientes:









Finalmente se puede concluir que para el ruido gaussiano nuevamente el filtrado de promedio es mucho más óptimo que utilizando kernel gaussiano, ya que en este último la imagen se ve menos nítida como se mencionó anteriormente. A continuación se muestra el código de lo mencionado anteriormente.

filgaus3=fspecial('gaussian',[13 13],2);

mesh(filgaus3);

imfilt7=imfilter(salpi,filgaus3,'replicate');

imshow(imfilt7);

psnr7=PSNR(lena_gris,imfilt7);


filgaus4=fspecial('gaussian',[19 19],3);

mesh(filgaus4);

imfilt8=imfilter(salpi,filgaus4,'replicate');

imshow(imfilt8);

psnr8=PSNR(lena_gris,imfilt8);


De todas las imágenes anteriormente filtradas el mejor resultado se obtuvo en el que el psnr tuvo el mayor valor es decir de 57.9369 y por tanto la mejor calidad de imagen.


Referencias

[1] http://omarsanchez.net/filtroespa.aspx


Read Users' Comments (1)comentarios

Chistes para ingenieros

ir arriba