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

HISTOGRAMA DE UNA IMAGEN

Realizado por: JESSICA GALVEZ


COD: 10
Meta
El objetivo de este tutorial es utilizar MATLAB y el IPT para calcular y
visualizar el histograma de una imagen.
Objetivos
Aprender a usar la funcin imhist del IPT.
Aprender otras tcnicas de graficacin de MATLAB que se pueden utilizar
para ver y analizar los datos del histograma.
Procedimiento
Comencemos a explorar la funcin imhist que es responsable del clculo y
visualizacin del histograma de una imagen.
1. Mostrar una imagen y su histograma.
I = imread(circuit.tif);
figure, subplot(2,2,1), imshow(I), title(Image)
subplot(2,2,2), imhist(I,256), axis tight, title(Histogram)

2. El paso anterior muestra el histograma de forma predeterminada para la


imagen de un histograma con 256 compartimientos. Vamos a ver qu
pasa si cambiamos este valor a 64 y 32.
subplot(2,2,3), imhist(I,64), axis tight, ...
title(Histogram with 64 bins)
subplot(2,2,4), imhist(I,32), axis tight, ...
title(Histogram with 32 bins)

Usted puede haber notado que fijamos el eje ajustando al mostrar los
histogramas.
Esto ajusta los lmites del eje a la gama de los datos.

Pregunta 1. Explicar el cambio drstico de los valores del eje cuando el


histograma se muestra con un menor nmero de compartimientos.

Puede haber una necesidad de post procesar los datos del histograma o
mostrarlo utilizando otras tcnicas de trazado. Para ello, necesitamos
obtener los valores de cada compartimiento del histograma. El paso
siguiente ilustra este procedimiento.
3. Obtener los valores de cada compartimiento del histograma para
su uso posterior.
c = imhist(I,32);

Podemos ahora usar los valores en c para visualizar el histograma


utilizando otras tcnicas de trazado. Naturalmente, el trazado de un
histograma muestra el conteo de cada compartimiento, esto puede ser
ms relevante para trazar el porcentaje de cada compartimiento. Esto se
puede hacer mediante la normalizacin de los datos, como se muestra
en el siguiente paso.
4. Normalizar los valores de c.
c_norm=c/numel(I);

Pregunta 2. Qu hace la funcin numel ?

Devuelve el nmero de elementos, n, en el conjunto A, equivalente a prod


(tamao (A)).
Pregunta 3. Escriba una lnea de sentencias en MATLAB que pueda
verificar que la suma de los valores normalizados son 1.
RESPUESTA:
T=sum(c_norm)

5. Cierre todas las figuras abiertas.


6. Visualizar los datos del histograma utilizando un grfico de barras.
figure, subplot(1,2,1), bar_1 = bar(c);
set(gca, XLim, [0 32], YLim, [0 max(c)]);

En el paso anterior, vimos cmo el grfico de barras se puede


personalizar. En MATLAB, casi todos los objetos que cree se pueden
personalizar. Cuando creamos el grfico de barras, hay un objeto axes y
un objeto de grfico de barras que aparece sobre el objeto axes. Aqu, la
variable bar_1 se establece en el objeto bar para que podamos hacer
referencia a ella ms tarde para una mayor personalizacin. La funcin
set nos permite cambiar la configuracin de un objeto en particular. El
primer parmetro de la funcin set es el objeto que desea personalizar.
En este caso, el primer objeto personalizado es gca, que significa
conseguir ejes actuales. Aqu, fijamos los lmites de los ejes X e Y. A
pesar de que los lmites se han establecido, la grfica es todava
ambigua porque las marcas de graduacin en los ejes X e Y no reflejan
los lmites.

7. Establezca las marcas de graduacin para reflejar los lmites de la


grfica.
set(gca, XTick, [0:8:32], YTick, ...
[linspace(0,7000,8) max(c)]);

Ahora las marcas de graduacin reflejan los lmites de los datos.


Utilizamos la funcin set para cambiar la configuracin de los ejes
actuales, pero podemos usarla con la misma facilidad para personalizar
la grfica de barras.
8. Utilice la funcin set para cambiar el color del grfico de barras. Adems,
de
al
grfico
un ttulo.
set(bar_1, FaceColor, r), title(Bar Chart)

Pregunta 4 Cmo podemos cambiar el ancho de las barras en un


grfico de barras?
Fjese en el paso anterior cmo utilizamos el objeto bar_1 del grfico de
barras para cambiar la configuracin. Del mismo modo, podemos
visualizar el grfico de barras normalizado en la misma figura usando
subplot
9. Vea el grfico de barras normalizado y personalizado.
subplot(1,2,2), bar_2 = bar(c_norm);
set(gca, XTick, [0:8:32], YTick, ...
[linspace(0,0.09,10) max(c_norm)])
xlim([0 32]), ylim([0 max(c_norm)])
title(Normalized Bar Chart)
set(bar_2, FaceColor, g)

Aqu, hemos hecho modificaciones similares como antes. Usted puede


haber notado que utilizamos funciones xlim y Ylim para establecer los
lmites de los ejes. A veces hay ms de una manera de realizar la misma
tarea, y este es un ejemplo de este ajuste. La funcin Stem charts son
similares a los grficos de barras.

10.Cierre todas las figuras abiertas.


11.Muestre Grficos Stem para ambos datos del histograma estndar y
normalizado.
figure,
subplot(1,2,1), stem(c,fill,MarkerFaceColor,red), ...
axis tight, title(Stem Chart)
subplot(1,2,2), stem(c_norm,fill,MarkerFaceColor,red), ...
axis tight, title(Normalized Stem Chart)

En el paso anterior, establecemos las propiedades visuales de el Stem


charts especificando los ajustes directamente en la funcin llamada
stem llenando el marcador y coloreando de color rojo. Podramos haber
establecido con la misma facilidad una variable igual al objeto stem y
utilizar la funcin set para hacer los cambios.

Pregunta 5 Explore las propiedades de Grficos Stem. Cmo


podemos hacer lneas de puntos?
Representa grficamente la secuencia de datos, Y, como tallos que se
extienden desde una lnea de base a lo largo del X eje y. Los valores de
datos
se
indican
con
crculos
que
terminan
cada tallo.
Pregunta 6 Alterar los lmites de los ejes y marcas de graduacin
para reflejar los datos que se muestran en el grfico Stem.
(X, Y) representa grficamente la secuencia de datos, Y, a valores
especificados por X. Los X y Y las entradas deben ser vectores o matrices
del mismo tamao.Adems, X puede ser un vector fila o columna y Y debe
ser una matriz con longitud (X) filas.

La funcin plot graficar los datos mediante la conexin de cada punto


con una lnea recta.
12.Mostrar una grfica con plot para ambos datos del histograma estndar
y normalizado.
figure, subplot(1,2,1), plot(c), axis auto, title(Plot Graph)
subplot(1,2,2), plot(c_norm), axis auto, ...
title(Normalized Plot Graph)

Pregunta 7 Explore las propiedades de grficos plot. En el cdigo


anterior, los puntos para cada compartimiento se pierden visualmente
dentro de la lnea del grfico. Cmo podemos hacer para que los
puntos sean ms notables y que sean ms visibles?

Colocando otros valores de rango.

ECUALIZACIN Y ESPECIFICACIONES DE UN HISTOGRAMA


Objetivo
El objetivo de este tutorial es aprender a usar el IPT para la ecualizacin
del histograma (global y local) y especificacin del histograma
(Histogram matching).
Objetivos
Explorar el proceso de ecualizacin del histograma.
Aprender a usar la funcin histeq.
Aprender cmo realizar la especificacin del histograma (Histogram
matching).
Explorar la demo interactiva para realizar la especificacin del
histograma
Aprenda cmo realizar ecualizacin del histograma local con la funcin
adapthisteq.
Que necesitars
M- file ihmdemo.m que es la demo interactiva para realizar la
especificacin
del
histograma
Procedimiento
Comencemos con la funcin histeq para realizar la ecualizacin del
histograma en nuestras propias imgenes, y mediante el uso de la
funcin imhist, podemos ver el histograma de la imagen original y
ajustada.
1. Visualizar la imagen pout y su histograma.
I = imread(pout.tif);
figure, subplot(2,2,1), imshow(I), ...
title(Original Image)
subplot(2,2,2), imhist(I), ...
title(Original Histogram)

2. Utilice la funcin histeq para realizar la ecualizacin del histograma.


I_eq = histeq (I, 256);
Pregunta 1 Por qu tiene que incluir el segundo parmetro
(256) en la llamada a la funcin histeq ?

Transforma la imagen de intensidad I, regresando en J una imagen de


intensidad con n niveles de gris discretos. Un nmero aproximadamente
igual de pxeles se asigna a cada uno de los n niveles en J, de modo que el
histograma de J es aproximadamente plana. (El histograma de J es ms
plana cuando n es mucho menor que el nmero de niveles discretos en I). El
valor predeterminado para n es 64.
3. Visualice la imagen ecualizada y su histograma.
subplot(2,2,3), imshow(I_eq), title(Equalized Image)
subplot(2,2,4), imhist(I_eq), title(Equalized Histogram)

Pregunta 2 Cul es el efecto de ecualizacin del histograma


en imgenes con bajo contraste?
Mejor a la imagen notablemente y utiliza todos los valores posibles
para su rango.
4. Cierre todas las figuras abiertas y borre todas las variables del
espacio de trabajo.
5. Ejecutar el siguiente cdigo para realizar ecualizacin del histograma
de la imagen tire.
I = imread(tire.tif); I_eq = histeq(I,256);
figure, subplot(2,2,1), imshow(I), title(Original Image)
subplot(2,2,2), imhist(I), title(Original Histogram)
subplot(2,2,3), imshow(I_eq), title(Equalized Image)
subplot(2,2,4), imhist(I_eq), title(Equalized Histogram)

Pregunta 3. En base al histograma original de la imagen tire,


que se puede decir de su brillo general?
Tiene un brillo ms intenso en la segunda grafica ya que se lanza a
los blancos no a los negros.
Pregunta 4 Cmo la ecualizacin del histograma afecta el
brillo
de
la
imagen
global
en este caso?
Por la programacin exacta que necesita haces, mas por los valores
que se otorga si va hacia los blancos o negros
Ecualizacin del histograma no siempre funcionan bien. Como
veremos en los prximos pasos, que depende de la imagen original.
6. Cierre todas las figuras abiertas y borre todas las variables del
espacio de trabajo.
7. Realizar la ecualizacin del histograma de la imagen eight.
I = imread(eight.tif); I_eq = histeq(I,256);
figure, subplot(2,2,1), imshow(I), title(Original Image)
subplot(2,2,2), imhist(I), title(Original Histogram)
subplot(2,2,3), imshow(I_eq), title(Equalized Image)
subplot(2,2,4), imhist(I_eq), title(Equalized Histogram)

Pregunta 5 Por qu hubo una prdida en la calidad de imagen


despus de la ecualizacin del histograma?
La funcin de transformacin para la ecualizacin del histograma es
simplemente el cdf de la imagen original.
8. Visualizar el cdf normalizada para la imagen eight.tif.
I_hist = imhist(I); tf = cumsum(I_hist); tf_norm = tf / max(tf);
figure, plot(tf_norm), axis tight

Pregunta 6 Qu hace la funcin cumsum en el paso anterior?


Devuelve la suma acumulada de A comenzando en el comienzo de la
primera dimensin de matriz en A cuyo tamao no es igual 1.
9. La funcin de transformacin tambin se puede obtener sin utilizar la
funcin cumsum.
[newmap, T] = histeq(I);
figure, plot(T)

Como hemos aprendido, el proceso de ecualizacin del histograma


intenta aplanar el histograma de la imagen. La especificacin del
Histograma (tambin conocido como histogram matching) intenta
hacer coincidir el histograma de la imagen a un histograma
especificado. La funcin histeq tambin se puede utilizar para esta
operacin.

10.Cierre todas las figuras abiertas y borre todas las variables del
espacio de trabajo.
11.Prepare un subplot y muestre la imagen original y su histograma.
img1 = imread(pout.tif);
figure, subplot(3,3,1), imshow(img1), title(Original Image)
subplot(3,3,2), imhist(img1), title(Original Histogram)

12.Visualice la imagen despus de la ecualizacin del histograma


matching.
img1_eq = histeq(img1); m1 = ones(1,256)*0.5;
subplot(3,3,4), imshow(img1_eq), title(Equalized Image)
subplot(3,3,5), imhist(img1_eq), title(Equalized Histogram)
subplot(3,3,6), plot(m1), title(Desired Histogram Shape), ...
ylim([0 1]), xlim([1 256])

13.Muestre la imagen donde la forma del histograma deseado es una


lnea recta de (0, 0) a (1, 1).
m2 = linspace(0,1,256); img2 = histeq(img1,m2);
subplot(3,3,7), imshow(img2), title(Matched Image)
subplot(3,3,8), imhist(img2), title(Matched Histogram)
subplot(3,3,9), plot(m2), title(Desired Histogram Shape), ...
ylim([0 1]), xlim([1 256])

Como podemos ver en las etapas anteriores, la realizacin de la


especificacin del histograma significa que debemos generar una
funcin que representa la forma del histograma deseado. La demo
interactiva ihmdemo.m (desarrollado por Jeremy Jacob) nos muestra
cmo crear una forma del histograma deseado que puede ser un
proceso interactivo.

14.Cierre todas las figuras abiertas y borre todas las variables del
espacio de trabajo.
15.Ejecutar la demostracin ihmdemo.m.
ihmdemo
16. Experimente con la creacin de su propia forma de histograma

deseado. Para crear nuevos puntos de la curva de funcin, haga clic


en la curva, en la ubicacin deseada. Para mover un punto, pulse y
arrastre el punto. Para eliminar un punto, simplemente haga clic en
l.
Pregunta 7 Qu hace la casilla Continuous Update?
Establece propiedades.
Pregunta 8 Cmo cambiar los diferentes mtodos de
interpolacin a la forma de la curva del histograma deseado?
Con el cursor y los puntos que podemos coger con respecto a la
grafica
Pregunta 9 Cmo puede la demo cargar
diferente?
Llamando a la imagen desde el programa en s

una

imagen

La ecualizacin del histograma local se lleva a cabo con la funcin


adapthisteq. Esta funcin realiza la ecualizacin adaptativa del
histograma con contraste limitado (CLAHE) y opera en regiones
pequeas de datos (llamados azulejos), cuyo tamao se puede pasar
como parmetro.

17.Realizar ecualizacin del histograma local, en la imagen de coins.png.


I = imread(coins.png);
I_eq = histeq(I,256);
I_leq = adapthisteq(I,ClipLimit,0.1);
figure, subplot(3,2,1), imshow(I), title(Original Image)
subplot(3,2,2), imhist(I), title(Original Histogram)
subplot(3,2,3), imshow(I_eq), title(Equalized Image)
subplot(3,2,4), imhist(I_eq), title(Equalized Histogram)
subplot(3,2,5), imshow(I_leq), ...
title(Local Histogram Equalization)
subplot(3,2,6), imhist(I_leq), ...
title(Local Hist Equalization Histogram)

El histograma de la imagen original es claramente bimodal, que


separa los pxeles del fondo de los pxeles que componen las
monedas. Ya hemos visto cmo las imgenes con distribucin bimodal
de tonos de pxeles no se desempean bien bajo ecualizacin del
histograma (global).

Pregunta 10 Qu hace el ajuste ClipLimit en la funcin


adapthisteq?
Bienes escalar en el rango [0 1] que especifica un lmite de aumento del
contraste. Los nmeros ms altos producen ms contraste.
Por defecto: 0.01
Pregunta 11 Cul es el tamao del azulejo por defecto
cuando se utiliza adapthisteq?
De 0 a 255

OTRAS TCNICAS DE MODIFICACIN DE UN HISTOGRAMA


Meta
El objetivo de este tutorial es aprender cmo realizar otras operaciones
comunes de modificacin del histograma.
Objetivos
Aprender a ajustar el brillo de una imagen por histograma deslizante.
Aprender a usar la funcin imadjust.
Aprender a usar la funcin stretchlim.
Explorar el ajuste de contraste de la imagen a travs del histograma de
estiramiento (tambin conocida como recorte de entrada).
Aprender cmo ajustar el contraste de una imagen con reduccin del
histograma (tambin conocido como el recorte de salida).
Procedimiento
El Histograma de deslizamiento o deslizante es el proceso de adicin o
sustraccin de un valor de brillo constante para todos los pxeles de la
imagen. Al aplicar el histograma deslizante, hay que asegurarse de que los
valores de los pxeles no salgan fuera de los lmites de la escala de grises.
Por lo tanto, los pxeles que dan lugar a valores mayores que 1 despus del
ajuste se establece en 1. Del mismo modo, los pxeles resultantes en valores
inferiores a cero despus del ajuste se establecern en 0.
1. Mostrar imagen original y preparar subplot.
J = imread(pout.tif);
I = im2double(J);
clear J
figure, subplot(3,2,1), imshow(I), title(Original Image)
subplot(3,2,2), imhist(I), axis tight, ...
title(Original Histogram)

2. Obtener una versin ms brillante de la imagen de entrada mediante la


adicin de 0,1 a cada pxel.
const = 0.1;
I2=I+const;
subplot(3,2,3), imshow(I2), title(Original Image + 0.1)
subplot(3,2,4), imhist(I2), axis tight, ...
title(Original Hist + 0.1)

Pregunta 1 Cmo cambi el histograma despus del ajuste?


Se cambian porque se aumenta en los valores del programa
3. Producir otra imagen ms brillante mediante la adicin de 0,5 a la
imagen original.
const = 0.5;
I3=I+const;
bad_values = find(I3 > 1);
I3(bad_values) = 1;
subplot(3,2,5), imshow(I3), title(Original Image + 0.5)
subplot(3,2,6), imhist(I3), axis tight, ...
title(Original Hist + 0.5)

Pregunta 2 Qu hace la variable bad_values ?


Hace que los valores no sean mayores a uno
Pregunta 3 Por qu la tercera grafica muestra un nmero tan
excesivo de pxeles con un valor de 1?
Por los rangos que se le dio dentro del programa.
El brillo de una imagen tambin puede ser modificado mediante la

funcin imadd (visto anteriormente en otro capitulo), que se encarga de


truncar y el redondeo de los valores fuera del rango deseado en la
imagen de salida.
El Histograma de estiramiento y de contraccin se puede lograr a travs
del uso de la funcin imadjust. La sintaxis de la funcin es la siguiente:
J = imadjust(I,[low_in; high_in],[low_out; high_out], gamma)

La Figura ilustra las funciones de transformacin cuando se usan


diferentes valores de gamma. Como ya sabemos por el captulo anterior
el valor de gamma es el exponente en la transformacin de la ley de
potencia.
Cualquier valor por debajo de low_in y por encima de high_in se recortan
o simplemente asignan a low_out y high_out, respectivamente. Slo los
valores en entre estos lmites se ven afectados por la curva. Valor de
Gamma menos de 1 crean una curva ponderada hacia el rango ms
brillante, y valores de gamma superiores a 1 hacia la regin ms
oscura. El valor predeterminado de gamma es 1.
Vamos a explorar cmo utilizar imadjust para realizar el histograma de
estiramiento.
4. Cierre las figuras abiertas.
5. Ejecute el siguiente cdigo para ver el histograma de estiramiento en la
imagen pout, que ya est cargado en la variable I.
img_limits = stretchlim(I);
I_stretch = imadjust(I,img_limits,[]);
figure
subplot(3,2,1), imshow(I), title(Original Image)
subplot(3,2,2), imhist(I), axis tight, ...
title(Original Histogram)
subplot(3,2,3), imshow(I_stretch), ...
title(Stretched Image)
subplot(3,2,4), imhist(I_stretch), axis tight, ...
title(Stretched Histogram)

Pregunta 4 Cmo cambi el histograma despus del ajuste?


Notablemente, ya que se movi los valores a lo largo de todo el rango
que se le dio.
Pregunta 5 Cul es el propsito de utilizar la funcin
stretchlim?
Devuelve Low_High, un vector de dos elementos de valores de pixel que especifican
lmites inferior y superior que se puede utilizar para el contraste de estiramiento
imagen I. Por defecto, los valores en Low_High especifican la parte inferior al 1% y
el 1% de todos los valores de los pxeles. Los valores de gris devueltos pueden ser
utilizados por el imadjust funcin para aumentar el contraste de una imagen.

En el paso anterior, se especifica los parmetros low_in, high_in,


low_out y high_out al llamar a la funcin imadjust cuando de hecho la
operacin
por
defecto
es
histograma
de
estiramiento
intencionadamente estos parmetros no son necesarios para llevar a
cabo un histograma de estiramiento. Observe en el siguiente paso
llamando a la funcin y slo especificando la imagen como su
parmetro, dar los mismos resultados.
6.

Realizar el histograma de estiramiento con imadjust usando parmetros


por defecto y con firmar que los resultados son idnticos a los obtenidos
antes.
I_stretch2 = imadjust(I);
subplot(3,2,5), imshow(I_stretch2), ...
title(Stretched Image)
subplot(3,2,6), imhist(I_stretch2), axis tight, ...
title(Stretched Histogram)
I_stretch_diff = imabsdiff(I_stretch, I_stretch2);
figure, imshow(I_stretch_diff,[])
min(I_stretch_diff(:))
max(I_stretch_diff(:))

Pregunta 6 Cmo se ve la imagen?


Mejor contraste en la escala de grises, se le nota mejor iluminacin.
Pregunta 7 Cul es el propsito de la inspeccin de sus valores
mximos y mnimos?
Para no sobrepasar los valores a ser modificados.
Para reducir el tamao de un histograma de una imagen, hay que
especificar explcitamente los parmetros.
Cierre las figuras abiertas y borre todas las variables del espacio de
trabajo.
8. Ejecute el siguiente cdigo para ver el resultado de la contraccin del
histograma.
7.

I = imread(westconcordorthophoto.png);
I_shrink = imadjust(I,stretchlim(I),[0.25 0.75]);
figure
subplot(2,2,1), imshow(I), title(Original Image)
subplot(2,2,2), imhist(I), axis tight, ...
title(Original Histogram)
subplot(2,2,3), imshow(I_shrink), ...
title(Shrunk Image)
subplot(2,2,4), imhist(I_shrink), axis tight, ...
title(Shrunk Histogram)

Cuando utilizamos otras tcnicas para ajustar el histograma de una


imagen, tenemos un medio para acceder a la funcin de transformacin
(por ejemplo, la funcin histeq devolver la funcin de transformacin
como parmetro de salida si se solicita).
Esta no es una tcnica para la visualizacin de una funcin de
transformacin al realizar el histograma deslizante, estiramiento o
encogimiento, pero podemos lograr una representacin visual de la
funcin de transformacin mediante el uso de la funcin plot. Para ello,
especificamos la imagen original como los valores de X y la imagen
ajustada como los valores de Y.
9. Muestra la funcin de transformacin para el ajuste realizado en el paso
anterior.
X = reshape(I,1,prod(size(I)));
Y = reshape(I_shrink,1,prod(size(I_shrink)));
figure, plot(X,Y,.)
xlim([0 255]); ylim([0 255]);
xlabel(Original Image);
ylabel(Adjusted Image);

Pregunta 8. Qu significan las anteriores


declaraciones en el cdigo, que hacen?

primeras

dos

Remodela usando el vector de tamao


Pregunta 9. Qu hacen las funciones xlabel y ylabel ?
Xlabel es el nombre que se le pone al eje de las X y ylabel es el nombre que
se le pone al eje de la Y.
Como se seal anteriormente, los valores de gamma distintos de 1
especificarn la forma de la curva, ya sea hacia lo brillante o la regin
oscura.
10.Cierre todas las figuras abiertas.
11.Realizar el histograma de contraccin con un valor gamma de 2.
I_shrink = imadjust(I,stretchlim(I),[0.25 0.75],2);
X = reshape(I,1,prod(size(I)));
Y = reshape(I_shrink,1,prod(size(I_shrink)));
figure
subplot(2,2,1), imshow(I), title(Original Image)
subplot(2,2,2), imhist(I), axis tight, ...
title(Original Histogram)
subplot(2,2,3), imshow(I_shrink), title(Adjusted Image)
subplot(2,2,4), imhist(I_shrink), axis tight, ...
title(Adjusted Histogram)
figure, plot(X,Y,.), xlim([0 255]), ylim([0 255])

Pregunta 10. La funcin de transformacin grfica muestra una brecha


de 0 a 12 (en el eje X), donde no hay puntos. Por qu se da esto?
Por los lmites que estamos poniendo al principio del cdigo.

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