36
EL7008 - Procesamiento Avanzado de Im´ agenes Tarea N 1 Filtrado de Im´ agenes y ecualizaci´ on de histograma Profesor: Javier Ruiz del Solar Auxiliar: Patricio Loncomilla Ayudante: Pedro Orellana Alumno: Sebasti´ an G´ alvez Ortiz Fecha: 24 de septiembre de 2015

Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

Embed Size (px)

Citation preview

Page 1: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

Tarea N◦1

Filtradode Imagenes y ecualizacion de histograma

Profesor:Javier Ruiz del Solar

Auxiliar:Patricio Loncomilla

Ayudante:Pedro Orellana

Alumno:Sebastian Galvez Ortiz

Fecha:24 de septiembre de 2015

Page 2: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

Indice

1. Introduccion 2

2. Marco Teorico 32.1. Filtrado de Imagenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.1. Filtros lineales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.1.2. Filtros no lineales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.2. Ecualizacion de histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3. Implementacion 63.1. Convolucion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.2. Filtro de mediana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.3. Ecualizacion de Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

4. Resultados y Analisis 104.1. Convolucion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

4.1.1. Filtro Recto 3× 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114.1.2. Filtro Recto 1× 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.1.3. Filtro Gaussiano 5× 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.1.4. Filtro Gaussiano 1× 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.1.5. Filtro Prewitt Vertical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.1.6. Filtro Prewitt Horizontal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4.2. Filtro de mediana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.3. Ecualizacion de Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

5. Conclusiones 27

6. Referencias 28

7. Anexos 297.1. main conv.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297.2. main median.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327.3. main histeq.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

1

Page 3: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

1. Introduccion

El objetivo general de esta tarea consiste en la implementacion de funciones de filtrado de imagenesy ecualizacion de histogramas en C++. En particular, se tiene como objetivo analizar los resultadosobtenidos al aplicar filtros pasa bajos y pasa altos especıficos, ademas de un filtro no-lineal de mediana.Por otro lado, se busca entender e implementar el algoritmo de ecualizacion de histogramas, analizandolos resultados para distintas imagenes.

Para manejar las imagenes en C++ se utilizara la librerıa de vision computacional OpenCV, quecuenta con clases y funciones especiales para este proposito. Si bien esta librerıa cuenta con las funcionespedidas, no se permite utilizarlas directamente, ya que no se generarıa ningun aprendizaje. Ademas, parael desarrollo de esta tarea se han facilitado tres proyectos de CMake que seran utilizados como base paraimplementar las funciones pedidas.

Las funciones especıficas a implementar en esta actividad son las siguientes: Convolucion 2D parauna mascara dada como entrada, Filtrado de mediana con ventanas de tamano 3×3 y Ecualizacion deHistograma de la imagen de entrada.

En el desarrollo de esta tarea se describiran brevemente los algoritmos a implementar y se explicaranlas partes mas relevantes del codigo implementado, para posteriormente mostrar y analizar los resultadosobtenidos al procesar distintas imagenes.

2

Page 4: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

2. Marco Teorico

2.1. Filtrado de Imagenes

El filtrado de una imagen consiste en una operacion local que modifica el valor de cada posicion de laimagen considerando los valores que posee la vecindad.

2.1.1. Filtros lineales

Para aplicar un filtro lineal g sobre una funcion f , se requiere realizar la operacion de convolucionbidimensional, la cual para el caso continuo esta descrita por la Eq. 1, pero para ser aplicada en unaimagen, se debe utilizar la forma discreta de la Eq. 2. [1]

f(x, y) ∗ g(x, y) =

∫ ∞τ1=−∞

∫ ∞τ2=−∞

f(τ1, τ2)g(x− τ1, y − τ2) dτ1 dτ2 (1)

f [x, y] ∗ g[x, y] =N∑n=1

M∑m=1

f [n,m]g[x− n, y −m] (2)

Donde la imagen es de tamano N ×M y el filtro g a aplicar corresponde en realidad a una mascara oventana de tamano definido. Es por esto que la aplicacion equivale a sobreponer la mascara en la posicion[x, y] de la imagen y calcular la suma de los productos entre los elementos correspondientes de la mascaray de la imagen, tal como ejemplifica la Figura 1.

Figura 1: Operacion de convolucion para filtrado lineal en un punto de una imagen.

Es claro que con este metodo existe un problema al querer calcular el resultado de la convolucion enlos bordes de la imagen, donde no existen elementos correspondientes a la superposicion de la ventanaen esa posicion, para lo cual existen diversas estrategias, donde las mas comunes son: la extrapolacion devalores, omitir los bordes y que la imagen de salida sea de menor tamano o utilizar un valor nulo en los

3

Page 5: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

pixeles externos.

2.1.2. Filtros no lineales

Debido a que no todas las operaciones pueden ser representadas mediante una mascara que permitarealizar la convolucion con la imagen, como ocurre por ejemplo al tratar de encontrar maximo o mınimolocal, mediana, comparaciones locales, etc.

Para aplicar estos filtros no lineales se debe utilizar una estrategia levemente distinta, donde deigual manera se considera una ventana de tamano definido, pero en estos casos se trabaja la operacionespecıfica utilizando la vecindad de la imagen que queda comprendida por la ventana. Por ejemplo, si sedesea calcular la mediana con una ventana de 3× 3, en cada posicion de la imagen se toman los valorescomprendidos por la ventana, se ordenan y se busca la mediana, la cual posteriormente otorga el valor enla imagen de salida para esa posicion.

2.2. Ecualizacion de histograma

Para modificar una imagen tambien se pueden utilizar operaciones globales, como lo es la ecualizacionde histograma, que tiene como objetivo acentuar el contraste visual, aprovechando de mejor manera elrango de valores de intensidad disponible.

Un histograma es una medida de frecuencia en la ocurrencia de cada valor o rango de valores de nivelde intensidad de gris dentro de una imagen. Usualmente se utiliza la frecuencia relativa, representando laprobabilidad de ocurrencia para ese nivel de gris, pero tambien puede utilizarse una frecuencia absolutadependiendo del uso que se le quiera dar. En la Eq. 3 se muestra como se calcula el valor del histogramapara el nivel k en una imagen de tamano N ×M .[2]

H(k) =#pixeles de intensidad k

N ·M(3)

Con esta medida se puede evaluar el contraste de la imagen, ya que si el grafico del histograma esestrecho, se identifica un bajo contraste, pues se utilizan pocos niveles y con valores muy cercanos. Si elgrafico muestra una distribucion mas amplia entre todos los niveles de gris, se tiene un mayor contrasteal visualizarse mas diferencias de intensidad en la imagen.

El histograma se considera ecualizado si todos los niveles de intensidad tienen una frecuencia lo massimilar posible. Para lograr esto en la practica, basta con lograr que el histograma acumulado de la imagense aproxime a una recta, tal como se muestra en la Figura 2.

4

Page 6: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

Figura 2: Ecualizacion de histograma, se muestran superpuestos los histogramas e histogramas acumuladosde una imagen sin procesar (izq.) y de una imagen cuyo histograma ha sido ecualizado (der.).

La forma de lograr la ecualizacion es mediante una funcion tipo tabla de look-up construida al nor-malizar el histograma acumulado al rango de niveles de intensidad de la imagen segun la Eq. 4.

Oi,j = floor{(L− 1)×H ′(Ii,j)} (4)

Donde I es la imagen de entrada, O es la imagen ecualizada, H ′ es el histograma acumulado, L es lacantidad de niveles de intensidad e i, j es la posicion del pixel a evaluar.

5

Page 7: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

3. Implementacion

Para desarrollar la tarea se trabajo en Ubuntu 15.04, con la version 2.4.11 de OpenCV y se utilizaroncomo base los proyectos CMake entregados junto al enunciado, modificandolos de manera de poder escogermediante terminal la imagen de entrada para cada operacion e implementando el codigo faltante de cadafuncion. En todos los casos se transforman las imagenes a escala de grises para procesarlas.

A continuacion, se describen los detalles de la implementacion de cada uno de los algoritmos.

3.1. Convolucion

Dentro del archivo main conv.cpp se incluye una funcion main() que se encarga de leer desde lacarpeta ’../../../img/’ la imagen seleccionada desde el terminal, ejecutar la funcion convolucion(...) conla mascara tambien seleccionada desde el terminal, mostrar la imagen de salida y finalmente guardarlaen la carpeta ’../../../out/conv/’ con un nombre adecuado.

Las mascaras implementadas son las siguientes:

1. Filtro pasa bajos recto de tamano 3× 3: 19

1 1 11 1 11 1 1

2. Filtro pasa bajos unidimensional de tamano 1× 3, aplicado por filas y por columnas: 1

3

[1 1 1

]3. Filtro Gaussiano pasa bajos bidimensional de tamano 5× 5, con σ2 = 1:

1

273

1.0 4.0 7.0 4.0 1.04.0 16.0 26.0 16.0 4.07.0 26.0 41.0 26.0 7.04.0 16.0 26.0 16.0 4.01.0 4.0 7.0 4.0 1.0

(5)

4. Filtro Gaussiano pasa bajos unidimensional de tamano 1 × 5, con σ2 = 1, aplicado por filas y porcolumnas: 1

17

[1.0 4.0 7.0 4.0 1.0

]5. Filtro pasa-altos Prewitt vertical: 1

3

−1 0 1−1 0 1−1 0 1

6. Filtro pasa-altos Prewitt horizontal: 13

−1 −1 −10 0 01 1 1

Notar el uso de factor de normalizacion 1

3 en las mascaras de Prewitt, debido a que el valor maximoposible para la respuesta al filtro en un punto es 3 veces la intensidad maxima de un pixel, por lo que alreducirlo en un tercio basta para mantenerse en el rango de intensidades.

6

Page 8: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

Para implementar la convolucion bidimensional, se decidio enfrentar el problema de bordes expan-diendolos con valor cero, para lo cual se utilizo el siguiente bloque de codigo:

10 void convolucion(Mat input , Mat mask , Mat output)

11 {

12 int maskRowsRad = mask.rows /2; // Row radius of mask

13 int maskColsRad= mask.cols /2; // Column radius of mask

14 /* Expand image filling with zeros */

15 Mat aux = Mat:: zeros(input.rows +2* maskRowsRad , input.cols +2* maskColsRad , CV_32FC1);

16 Mat ROI = aux(Rect(maskColsRad ,maskRowsRad ,input.cols ,input.rows)); // Rect(x,y,

width ,height)

17 input.copyTo(ROI);

De esta manera, se recorren los pixeles de la imagen original por filas y columnas, pero se utilizan losvalores de la imagen aux. Luego, como se muestra a continuacion, se calcula la suma de los productos delos elementos correspondientes entre la mascara y la imagen:

19 /* Iterate through every pixel that corresponded to a valid position in the input

image */

20 for (int r=maskRowsRad; r<aux.rows -maskRowsRad ; r++)

21 {

22 for (int c=maskColsRad ; c<aux.cols -maskColsRad; c++)

23 {

24 float accum= 0.0; // Apply the mask on that pixel ’s neighborhood

25 for(int m_r =0; m_r <mask.rows; m_r ++)

26 {

27 for(int m_c =0; m_c <mask.cols; m_c ++)

28 {

29 accum += aux.at <float >(r+m_r -maskRowsRad ,c+m_c -maskColsRad)*mask.at <float >(m_r ,

m_c);

30 }

31 }

32 output.at<float >(r-maskRowsRad ,c-maskColsRad) = accum; // Set the value to

corresponding output pixel

33 }

34 }

3536 }

Gracias a la indexacion utilizada, una vez calculada la suma correspondiente a aplicar la mascara auna posicion, basta asignar el valor de la suma a la imagen de salida en esa posicion. Finalmente, cuandose termina de iterar se cuenta con la imagen output modificada con los valores de la imagen filtrada.

7

Page 9: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

3.2. Filtro de mediana

En este caso se implemento el archivo main median.cpp de manera analoga al caso anterior, con laprincipal diferencia de que el main() ejecuta la funcion mediana(...) para procesar las imagenes, y lassalidas son guardadas en la carpeta ’../../../out/median/’.

La funcion mediana(...) implementa el filtro de mediana con ventanas de tamano 3 × 3, por lo quepara expandir la imagen y recorrer sus pixeles equivale al caso de la convolucion salvo que al momento derecorrer la ventana lo que se hace es ordenar los valores de los pixeles contenidos en un arreglo dinamicoy asignar el del medio a la imagen output, tal como se muestra en el siguiente bloque de codigo:

20 for (int r=windowRad; r<aux.rows -windowRad ; r++)

21 {

22 for (int c=windowRad ; c<aux.cols -windowRad; c++)

23 {

24 vector <float > pixVals;

25 for(int m_r =0; m_r <windowSize; m_r ++)

26 {

27 for(int m_c =0; m_c <windowSize; m_c ++)

28 {

29 pixVals.push_back(aux.at <float >(r+m_r -windowRad ,c+m_c -windowRad));

30 }

3132 }

33 sort(& pixVals [0], &pixVals [( pixVals.size() -1)]);

34 output.at<float >(r-windowRad ,c-windowRad) = pixVals [( pixVals.size() -1)/2]; // Set

the median to corresponding output pixel.

35 }

36 }

Para realizar el ordenamiento se uso la funcion sort(...) de la librerıa ¡algorithm¿ sobre el vector pixVals

8

Page 10: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

3.3. Ecualizacion de Histograma

La implementacion de este algoritmo fue realizada en el archivo main histeq.cpp, editando de manerasimilar el main()a los casos anteriores para permitir la seleccion de imagenes desde el terminal y que lasimagenes de salida se guarden en la carpeta ’../../../out/histeq/’. En este caso la funcion invocada paraprocesar la imagen es ecualizar(...), donde se desarrollan los siguientes pasos:

Calcular histograma:Se utiliza el codigo que venıa incluido en el archivo:

12 void ecualizar(Mat input , Mat output)

13 {

14 // Calculate Histogram (not normalized).

15 int hist [256];

16 for (int i=0; i <256; i++)

17 hist[i] = 0;

18 for (int r=0; r<input.rows; r++)

19 {

20 for (int c=0; c<input.cols; c++)

21 {

22 int ind = input.at <unsigned char >(r,c);

23 hist[ind] = hist[ind ]+1;

24 }

25 }

Calcular histograma acumulado:

26 // Calculate Accumulated Histogram (not normalized)

27 int accum_hist [256];

28 accum_hist [0] = hist [0];

29 for (int i=1; i <256; i++)

30 accum_hist[i] = hist[i]+ accum_hist[i-1];

Generar look-up table:Segun lo descrito en la Eq.4, se calcula el valor a asignar para cada nivel de intensidad:

41 // Create LookUp Table with Accumulated Histogram normalized to range [0 ,255]:

42 int accumMinimum = getMin(accum_hist ,256);

43 int lookUp [256];

44 for(int i = 0; i <256; i++)

45 lookUp[i] = floor (255*( accum_hist[i]-accumMinimum)/(input.rows*input.cols -

accumMinimum));

Modificar imagen de salida:Asignar el valor nuevo a la posicion correspondiente en la imagen output.

47 // Equalize image using the LookUp Table

48 for (int r=0; r<input.rows; r++)

49 for (int c=0; c<input.cols; c++)

50 output.at<unsigned char >(r,c)=lookUp[input.at<unsigned char >(r,c)];

5152 return;

53 }

Si bien los ultimos dos pasos se pueden realizar en uno solo, se prefirio realizarlos de manera separadapara facilitar la lectura del codigo.

9

Page 11: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

4. Resultados y Analisis

En esta seccion se mostraran las imagenes de prueba utilizadas para probar cada algoritmo implemen-tado, como tambien las imagenes resultantes obtenidas al aplicar cada algoritmo, incluyendo un analisisde los resultados.

4.1. Convolucion

Para probar los alcances del filtrado mediante convolucion con las mascaras implementadas, se utili-zaron las 3 imagenes de prueba mostradas en la Figura 3.

(a) Cuadrado: 537× 416 (b) Red fox: 635× 528

(c) Table Tennis: 650×390

Figura 3: Imagenes de prueba para modulo de filtrado por convolucion.

10

Page 12: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

4.1.1. Filtro Recto 3× 3

(a) Cuadrado (b) Cuadrado filtrado

Figura 4: Resultados filtro Recto 3× 3.

(a) Red fox (b) Red fox filtrado

Figura 5: Resultados filtro Recto 3× 3.

11

Page 13: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

(a) Table Tennis (b) Table Tennis filtrado

Figura 6: Resultados filtro Recto 3× 3.

4.1.2. Filtro Recto 1× 3

En este caso el filtro fue aplicado primero por filas y luego por columnas, al invocar nuevamente lafuncion convolucion(...) con la mascara traspuesta.

(a) Cuadrado (b) Cuadrado filtrado

Figura 7: Resultados filtro Recto 1× 3 aplicado por filas y columnas.

12

Page 14: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

(a) Red fox (b) Red fox filtrado

Figura 8: Resultados filtro Recto 1× 3 aplicado por filas y columnas.

(a) Table Tennis (b) Table Tennis filtrado

Figura 9: Resultados filtro Recto 1× 3 aplicado por filas y columnas.

Se puede observar que luego de ser filtradas con estas mascaras las imagenes estan mas borrosas,debido al efecto conocido como blur producido por el pasa bajos que en este caso no es tan pronunciadodebido a que el tamano de la ventana es muy pequeno con respecto al de las imagenes. Sin embargo, porejemplo en las Figuras 4 y 7 se nota que los bordes dejaron de ser una discontinuidad abrupta y existealgo de suavidad en la transicion de los niveles de intensidad. Esto se traduce en que las variaciones dealta frecuencia son atenuadas, mientras que las zonas mas homogeneas permanecen inalteradas.

El hecho de que sea equivalente aplicar una mascara bidimensional para este filtro o aplicar la mascaraunidimensional por filas y luego por columnas es debido a la simetrıa de la mascara, y a la separabilidadde la misma, puesto que al multiplicar la mascara Rect1x3 · (Rect1x3)T se obtiene Rect3x3. Es decir, laconvolucion bidimensional se puede separar en dos convoluciones unidimensionales con el filtro de unadimension, aumentando la eficiencia computacional del calculo.

13

Page 15: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

4.1.3. Filtro Gaussiano 5× 5

(a) Cuadrado (b) Cuadrado filtrado

Figura 10: Resultados filtro Gaussiano 5× 5.

(a) Red fox (b) Red fox filtrado

Figura 11: Resultados filtro Gaussiano 5× 5.

14

Page 16: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

(a) Table Tennis (b) Table Tennis filtrado

Figura 12: Resultados filtro Gaussiano 5× 5.

4.1.4. Filtro Gaussiano 1× 5

(a) Cuadrado (b) Cuadrado filtrado

Figura 13: Resultados filtro Gaussiano 1× 5 aplicado por filas y columnas.

15

Page 17: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

(a) Red fox (b) Red fox filtrado

Figura 14: Resultados filtro Gaussiano 1× 5 aplicado por filas y columnas.

(a) Table Tennis (b) Table Tennis filtrado

Figura 15: Resultados filtro Gaussiano 1× 5 aplicado por filas y columnas.

Al aplicar las mascaras de filtros pasa bajos correspondientes a Gaussianas se tiene un efecto similar alos filtros rectos, debido a que la gaussiana equivale a un promedio ponderado, lo que hace que el suavizadode las altas frecuencias sea mas atenuado. El hecho de que se note menos el efecto blur es por esta razon,considerando tambien que el tamano de la ventana sigue siendo muy pequeno respecto al tamano de laimagen, y la Gaussiana representada en la mascara tiene una desviacion estandar igual a 1.

En este caso tambien se verifica la separabilidad del filtro, debido a que la mascara Gaussiana bidimen-sional es simetrica y puede ser construida mediante el producto de la mascara Gaussiana unidimensionalcon su traspuesto.

16

Page 18: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

4.1.5. Filtro Prewitt Vertical

(a) Cuadrado (b) Cuadrado filtrado

Figura 16: Resultados filtro Prewitt vertical.

(a) Red fox (b) Red fox filtrado

Figura 17: Resultados filtro Prewitt vertical.

17

Page 19: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

(a) Table Tennis (b) Table Tennis filtrado

Figura 18: Resultados filtro Prewitt vertical.

4.1.6. Filtro Prewitt Horizontal

(a) Cuadrado (b) Cuadrado filtrado

Figura 19: Resultados filtro Prewitt horizontal.

18

Page 20: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

(a) Red fox (b) Red fox filtrado

Figura 20: Resultados filtro Prewitt horizontal.

(a) Table Tennis (b) Table Tennis filtrado

Figura 21: Resultados filtro Prewitt horizontal.

Se puede observar de las dos versiones del filtro de Prewitt que se trata de un filtro pasa-altos, debidoa que en la imagen resultante se resaltan los bordes y discontinuidades de alta frecuencia, mientras quelas zonas homogeneas como la nieve y fondo de las Figuras 17 y 20 o de variaciones de baja frecuenciapresentan una baja respuesta al filtro. Si se fija en el caso del filtro Prewitt vertical, en la Figuras 16 y18 se nota claramente que este filtro permite detectar bordes de orientacion vertical, ya que por ejemplolos lados horizontales del cuadrado o de la mesa de tenis de mesa son completamente eliminados de laimagen resultante, mientras que las lıneas verticales aparecen claramente destacadas. Sucede lo opuestopara el filtro Prewitt horizontal, ya que en las Figuras 19 y 21, se resaltan los bordes horizontales.

En la imagen Red fox no es tan clara la diferencia, debido a que la imagen no posee bordes tanpronunciados, pero de igual manera se puede notar que el filtrado pasa-altos discrimina segun la orientacionde la mascara al observar cuidadosamente la direccion del pelaje del zorro que se resalta en la imagenresultante.

19

Page 21: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

4.2. Filtro de mediana

Para probar el filtro de mediana implementado, se utilizaron las 6 imagenes de prueba de la Figura22.

(a) Penguins: 275× 183 (b) Building: 400× 300

(c) Lena: 512× 512 (d) Chinese food: 600× 399

(e) Balloons: 640× 480 (f) Taj Mahal: 300×300

Figura 22: Imagenes de prueba para modulo de filtrado de mediana.

En las imagenes (a) y (b) se cuenta con ruido impulsivo (salt & pepper) leve, mientras que en (c) y(d) no se tiene este tipo de ruido en forma notable. Las imagenes (e) y (f) son extremadamente ruidosas.

20

Page 22: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

Al probar estas imagenes se obtuvieron los resultados mostrados en la Figura 23:

(a) Penguins filtrado (b) Building filtrado

(c) Lena filtrado (d) Chinese food filtrado

(e) Balloons filtrado (f) Taj Mahal filtrado

Figura 23: Imagenes resultantes del filtrado de mediana con ventanas de 3× 3.

21

Page 23: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

Los resultados muestran una reduccion clara del ruido impulsivo en casi todas las imagenes. Aunqueen los casos con ruido extremo no pudo ser reducido notablemente, se aprecia que el contenido de laimagen de los globos se puede visualizar mucho mejor luego del filtrado, mientras que la imagen delTaj Mahal pareciera estar un poco mas limpia. En los casos (c) y (d) en que no existe este ruido no senotan mayores cambios debido al tamano pequeno de la ventana del filtro comparado con el tamano dela imagen. Notablemente en la imagen (b) se redujo el ruido hasta un punto en que es imperceptible asimple vista, mientras que en la imagen (a) aun se notan residuos del ruido, pero la reduccion es clara.

El hecho de utilizar el filtrado no lineal de mediana permite eliminar este tipo de ruido que no hubierasido posible con un filtro pasa bajos, ya que el ruido perderıa intensidad, pero cada uno de los puntos deruido se extenderıa considerablemente en la imagen.

22

Page 24: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

4.3. Ecualizacion de Histograma

Se eligieron las 6 imagenes de la Figura 24 para probar la ecualizacion de histograma implementada.De ellas, (c) y (e) cuentan con problemas de iluminacion (sobre-exposicion), (a),(b) y (f) tienen problemasde bajo contraste, y (d) no presenta ninguno de estos problemas.

(a) Valle: 275× 183 (b) Cochamo: 566× 421

(c) Bird: 571× 385 (d) Chinese food: 600× 399

(e) Mountains: 658× 365 (f) MRIBrain: 350×350

Figura 24: Imagenes de prueba para modulo de ecualizacion de histograma.

23

Page 25: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

Los resultados de ecualizar los histogramas se muestran a continuacion pareando la imagen originalcon la resultante para apreciar mejor los cambios.

(a) Valle (b) Valle con histograma ecualizado.

Figura 25: Resultado de Ecualizacion de histograma.

(a) Cochamo (b) Cochamo con histograma ecualizado.

Figura 26: Resultado de Ecualizacion de histograma.

(a) Bird (b) Bird con histograma ecualizado.

Figura 27: Resultado de Ecualizacion de histograma.

24

Page 26: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

(a) Chinese food (b) Chinese food con histograma ecualizado.

Figura 28: Resultado de Ecualizacion de histograma.

(a) Mountains (b) Mountains con histograma ecualizado.

Figura 29: Resultado de Ecualizacion de histograma.

(a) MRIBrain (b) MRIBrain con histograma ecualizado.

Figura 30: Resultado de Ecualizacion de histograma.

25

Page 27: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

En la Figura 25 se nota que se logro aumentar el contraste, permitiendo visualizar con mas detalle losrelieves del valle que muestra la imagen. De la misma forma, la imagen de la Figura 26 contaba con bajailuminacion en las montanas del fondo y la zona de arboles de la derecha, produciendo zonas homogeneasy de bajo contraste. Al ecualizar el histograma se permite visualizar mucho mas detalle en esas zonas.

De la Figura 28 se observa que no hay un cambio considerable en la imagen procesada respecto de laoriginal, lo que hace entender que el histograma de la imagen de entrada ya estaba bien distribuido. Porotro lado, en las Figuras 27 y 29 la sobre-exposicion trata de ser compensada por el algoritmo, pero en laimagen Bird se nota claramente que en toda la zona inferior no se pueden revelar detalles ocultos debidoa que la informacion no estaba contenida en un principio posiblemente por saturacion del sensor. En laimagen Mountains se logra compensar un poco el efecto de iluminacion excesiva en la montana que estaen primer plano, pero en el fondo se sigue mostrando con sobre-exposicion.

Por ultimo, el resultado en la Figura 30 muestra algo similar al caso de la imagen Bird, ya que laszonas negras del fondo de la imagen no contienen informacion util de contraste, pero igual influye en elhistograma, por lo que la zona del cerebro en particular no mejora su contraste, si no que se empeora, locual no serıa util en una aplicacion medica.

26

Page 28: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

5. Conclusiones

Luego de haber implementado correctamente las funciones pedidas y probar la implementacion anali-zando los resultados obtenidos para distintas imagenes se puede concluir que se cumplieron los objetivosde esta tarea, permitiendo aumentar el aprendizaje sobre materia de procesamiento de imagenes con fil-tros lineales, no lineales y de ecualizacion de histogramas, ademas de lograr familiarizarse con los objetosutilizados por la librerıa OpenCV para el manejo de imagenes.

En particular, para los casos analizados, la funcion de convolucion bidimensional implementada sedesempeno de manera correcta, permitiendo concluir que existen formas mas eficientes para aplicar masca-ras simetricas separables, como lo fueron el caso del filtro recto y el filtro Gaussiano.

Ademas, se observo que los filtros pasa-bajos estudiados producen un efecto de desenfoque o blur,atenuando las zonas de la imagen que presentan cambios con alta frecuencia, lo que podrıa permitireliminar ciertos ruidos de tipo Gaussiano.

Por otro lado, con esta actividad se logro demostrar que los filtros pasa-altos, en particular el filtrode Prewitt, permiten la deteccion de bordes en la imagen debido a que se resaltan las zonas con dis-continuidades o cambios abruptos en la intensidad, dependiendo de la orientacion del filtro utilizado. Unaspecto interesante es que las imagenes obtenidas de aplicar un filtro Prewitt horizontal y un filtro Prewittvertical pueden ser combinadas, permitiendo contar con una imagen de bordes que puede ser procesadaposteriormente para deteccion de formas de objetos u otras aplicaciones.

Mediante las pruebas realizadas para el algoritmo de filtrado no lineal con operacion de mediana selogra concluir que este tipo de filtro es muy util para reducir ruidos impulsivos (salt & pepper noise), ypor ende constituyen una herramienta potente para el pre-procesamiento en diversas situaciones.

Finalmente, se concluye a partir de las observaciones hechas sobre el algoritmo de ecualizacion dehistograma que es posible realizar operaciones globales que mejoren el contraste de la imagen, permitiendoaumentar la calidad de detalle presente al aprovechar de mejor manera el rango de niveles de intensidadpermitidos. En los casos analizados se logra mejorar algunos problemas de mala iluminacion de la imagen,los cuales podrıan ser perjudiciales si se desea extraer caracterısticas para el estudio de su contenido.

27

Page 29: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

6. Referencias

Referencias

[1] Convolucion2D, Material Docente U-Cursos - EL7008 Procesamiento Avanzado de Imagenes, 2015-2

[2] Fernandez, L. A., Diaz, D., & Depaoli, R. (2005). , Optimizacion de la ecualizacion del histo-grama en el procesamiento de imagenes digitales. In VII Workshop de Investigadores en Ciencias dela Computacion.

[3] Histogram Equalization, http://www.math.uci.edu/icamp/courses/math77c/demos/hist_

eq.pdf.

28

Page 30: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

7. Anexos

7.1. main conv.cpp

1 #define _DEBUG

2 #include <iostream >

3 #include <cv.h>

4 #include <highgui.h>

5 #include <string >

6 #include <sstream >

7 using namespace std;

8 using namespace cv;

910 void convolucion(Mat input , Mat mask , Mat output)

11 {

12 int maskRowsRad = mask.rows /2; // Row radius of mask

13 int maskColsRad= mask.cols /2; // Column radius of mask

14 /* Expand image filling with zeros */

15 Mat aux = Mat:: zeros(input.rows +2* maskRowsRad , input.cols +2* maskColsRad , CV_32FC1);

16 Mat ROI = aux(Rect(maskColsRad ,maskRowsRad ,input.cols ,input.rows)); // Rect(x,y,

width ,height)

17 input.copyTo(ROI);

1819 /* Iterate through every pixel that corresponded to a valid position in the input

image */

20 for (int r=maskRowsRad; r<aux.rows -maskRowsRad ; r++)

21 {

22 for (int c=maskColsRad ; c<aux.cols -maskColsRad; c++)

23 {

24 float accum= 0.0; // Apply the mask on that pixel ’s neighborhood

25 for(int m_r =0; m_r <mask.rows; m_r ++)

26 {

27 for(int m_c =0; m_c <mask.cols; m_c ++)

28 {

29 accum += aux.at <float >(r+m_r -maskRowsRad ,c+m_c -maskColsRad)*mask.at <float >(m_r ,

m_c);

30 }

31 }

32 output.at<float >(r-maskRowsRad ,c-maskColsRad) = accum; // Set the value to

corresponding output pixel

33 }

34 }

3536 }

3738 int main(void)

39 {

40 /* Select image */

41 int imgNumber;

42 stringstream inputPath;

43 string imgName;

44 inputPath << "../../../ img/conv/";

45 cout << "Select input image number: \n"

46 << "\t0 = cuadrado.png \n"

47 << "\t1 = redfox.jpg \n"

48 << "\t2 = tabletennis.jpg \n";

49 cin >> imgNumber;

50 switch(imgNumber){

29

Page 31: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

51 case 0: imgName = "cuadrado.png"; break;

52 case 1: imgName = "redfox.jpg"; break;

53 case 2: imgName = "tabletennis.jpg"; break;

54 default: imgName = "cuadrado.png"; cout << "Using default image:" << imgName <<

endl;

55 }

56 inputPath << imgName;

57 Mat originalRGB = imread(inputPath.str()); //Leer imagen

58 if(originalRGB.empty ()) // No encontro la imagen

59 {

60 cout << "Imagen no encontrada" << endl;

61 return 1;

62 }

63 Mat original;

64 cvtColor(originalRGB , original , CV_BGR2GRAY);

65 Mat input;

66 original.convertTo(input , CV_32FC1);

6768 /* Select filter */

69 int maskNumber;

70 string filtName;

71 cout << "Select filter: \n"

72 << "\t0 = Filtro pasa bajos recto 3x3\n"

73 << "\t1 = Filtro pasa bajos 1x3 aplicado por filas y columnas\n"

74 << "\t2 = Filtro Gaussiano pasa bajos 5x5 (sigma ^2 =1)\n"

75 << "\t3 = Filtro Gaussiano pasa bajos 1x5 aplicado por filas y columnas\n"

76 << "\t4 = Filtro pasa altos Prewitt vertical\n"

77 << "\t5 = Filtro pasa altos Prewitt horizontal\n";

78 cin >> maskNumber;

79 float maskval [9] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};

80 Mat mask = Mat(3, 3, CV_32FC1 , maskval)/9.0;

81 switch(maskNumber){

82 case 0: {

83 filtName = "Rect3x3_";

84 break;

85 }

86 case 1: {

87 filtName = "Rect1x3_";

88 float maskval1 [3] = {1.0, 1.0, 1.0 };

89 mask = Mat(1, 3, CV_32FC1 , maskval1)/3.0;

90 break;

91 }

92 case 2: {

93 filtName = "Gaussian5x5_"; // Fuente: http :// homepages.inf.ed.ac.uk/rbf/HIPR2/

gsmooth.htm

94 float maskval2 [25] = {1.0, 4.0, 7.0, 4.0, 1.0,

95 4.0, 16.0, 26.0, 16.0, 4.0,

96 7.0, 26.0, 41.0 ,26.0 ,7.0,

97 4.0, 16.0 , 26.0, 16.0, 4.0,

98 1.0, 4.0, 7.0, 4.0, 1.0};

99 mask = Mat(5, 5, CV_32FC1 , maskval2)/273.0;

100 break;

101 }

102 case 3: {

103 filtName = "Gaussian1x5_";

104 float maskval3 [5] = {1.0, 4.0, 7.0, 4.0, 1.0};

105 mask = Mat(1, 5, CV_32FC1 , maskval3)/17.0;

106 break;

30

Page 32: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

107 }

108 case 4: {

109 filtName = "VertPrewitt_";

110 float maskval4 [9] = {-1.0, 0.0, 1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0};

111 mask = Mat(3, 3, CV_32FC1 , maskval4)/3.0;

112 break;

113 }

114 case 5: {

115 filtName = "HorPrewitt_";

116 float maskval5 [9] = {-1.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0};

117 mask = Mat(3, 3, CV_32FC1 , maskval5)/3.0;

118 break;

119 }

120 default: filtName = "Rect3x3_"; cout << "Using default filter: "<< filtName << endl;

121 }

122 Mat output = Mat:: zeros(input.rows , input.cols , CV_32FC1);

123 convolucion(input , mask , output);

124 if(maskNumber == 1 || maskNumber == 3) // Si son filtros 1D, aplicar luego el

traspuesto (por columnas).

125 convolucion(output ,mask.t(),output);

126 output = abs(output);

127128 Mat last;

129 output.convertTo(last , CV_8UC1);

130 imshow(filtName+imgName , last); // Mostrar imagen

131 stringstream outPath;

132 outPath << "../../../ out/conv/" << filtName << imgName;

133 imwrite(outPath.str(), last); // Grabar imagen

134 cvWaitKey (0); // Pausa , permite procesamiento interno de OpenCV

135136 return 0; // Sale del programa normalmente

137 }

31

Page 33: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

7.2. main median.cpp

1 #define _DEBUG

2 #include <iostream >

3 #include <cv.h>

4 #include <highgui.h>

5 #include <algorithm >

6 #include <string >

7 #include <sstream >

8 using namespace std;

9 using namespace cv;

1011 void mediana(Mat input , Mat output)

12 {

13 int windowSize= 3;

14 int windowRad = windowSize /2;

15 /* Expand image filling with zeros */

16 Mat aux = Mat:: zeros(input.rows +2* windowRad , input.cols +2* windowRad , CV_32FC1);

17 Mat ROI = aux(Rect(windowRad ,windowRad ,input.cols ,input.rows)); // Rect(x,y,width ,

height)

18 input.copyTo(ROI);

1920 for (int r=windowRad; r<aux.rows -windowRad ; r++)

21 {

22 for (int c=windowRad ; c<aux.cols -windowRad; c++)

23 {

24 vector <float > pixVals;

25 for(int m_r =0; m_r <windowSize; m_r ++)

26 {

27 for(int m_c =0; m_c <windowSize; m_c ++)

28 {

29 pixVals.push_back(aux.at <float >(r+m_r -windowRad ,c+m_c -windowRad));

30 }

3132 }

33 sort(& pixVals [0], &pixVals [( pixVals.size() -1)]);

34 output.at<float >(r-windowRad ,c-windowRad) = pixVals [( pixVals.size() -1)/2]; // Set

the median to corresponding output pixel.

35 }

36 }

37 }

3839 int main(void)

40 {

41 /* Select image */

42 int imgNumber;

43 stringstream inputPath;

44 string imgName;

45 inputPath << "../../../ img/median/";

46 cout << "Select input image number: \n"

47 << "\t0 = saltpepper.jpg \n"

48 << "\t1 = lena.bmp \n"

49 << "\t2 = balloons.png \n"

50 << "\t3 = building.jpg \n"

51 << "\t4 = redfox.jpg \n"

52 << "\t5 = taj.jpg \n";

53 cin >> imgNumber;

54 switch(imgNumber){

32

Page 34: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

55 case 0: imgName = "saltpepper.jpg"; break;

56 case 1: imgName = "lena.bmp"; break;

57 case 2: imgName = "balloons.png"; break;

58 case 3: imgName = "building.jpg"; break;

59 case 4: imgName = "redfox.jpg"; break;

60 case 5: imgName = "taj.jpg"; break;

61 default: imgName = "saltpepper.jpg"; cout << "Using default image:" << imgName <<

endl;

62 }

63 inputPath << imgName;

64 Mat originalRGB = imread(inputPath.str()); //Leer imagen

65 if(originalRGB.empty ()) // No encontro la imagen

66 {

67 cout << "Imagen no encontrada" << endl;

68 return 1;

69 }

70 Mat original;

71 cvtColor(originalRGB , original , CV_BGR2GRAY);

72 Mat input;

73 original.convertTo(input , CV_32FC1);

7475 Mat output = Mat:: zeros(input.rows , input.cols , CV_32FC1);

76 mediana(input , output);

7778 Mat last;

79 output.convertTo(last , CV_8UC1);

8081 imshow("median3x3_"+imgName , last); // Mostrar imagen

82 stringstream outPath;

83 outPath << "../../../ out/median/" << "median3x3_"<< imgName;

84 imwrite(outPath.str(), last); // Grabar imagen

85 cvWaitKey (0); // Pausa , permite procesamiento interno de OpenCV

8687 return 0; // Sale del programa normalmente

88 }

33

Page 35: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

7.3. main histeq.cpp

1 #define _DEBUG

2 #include <iostream >

3 #include <cv.h>

4 #include <highgui.h>

5 #include <math.h>

67 using namespace std;

8 using namespace cv;

910 int getMin(int array[], int size);

1112 void ecualizar(Mat input , Mat output)

13 {

14 // Calculate Histogram (not normalized).

15 int hist [256];

16 for (int i=0; i <256; i++)

17 hist[i] = 0;

18 for (int r=0; r<input.rows; r++)

19 {

20 for (int c=0; c<input.cols; c++)

21 {

22 int ind = input.at <unsigned char >(r,c);

23 hist[ind] = hist[ind ]+1;

24 }

25 }

26 // Calculate Accumulated Histogram (not normalized)

27 int accum_hist [256];

28 accum_hist [0] = hist [0];

29 for (int i=1; i <256; i++)

30 accum_hist[i] = hist[i]+ accum_hist[i-1];

3132 // Save Histogram and Accumulated Histogram in file.

3334 FILE * pFile;

35 pFile = fopen ("../../../ out/histeq/hist.txt","w");

36 fprintf(pFile ,"pix ,Hist ,acHist ,ImSize: %dx %d\n",input.cols ,input.rows);

37 for (int i=0; i <256; i++)

38 fprintf(pFile ," %d, %d, %d\n",i,hist[i],accum_hist[i]);

39 fclose (pFile);

4041 // Create LookUp Table with Accumulated Histogram normalized to range [0 ,255]:

42 int accumMinimum = getMin(accum_hist ,256);

43 int lookUp [256];

44 for(int i = 0; i <256; i++)

45 lookUp[i] = floor (255*( accum_hist[i]-accumMinimum)/(input.rows*input.cols -

accumMinimum));

4647 // Equalize image using the LookUp Table

48 for (int r=0; r<input.rows; r++)

49 for (int c=0; c<input.cols; c++)

50 output.at<unsigned char >(r,c)=lookUp[input.at<unsigned char >(r,c)];

5152 return;

53 }

54 /*

55 * Returns the minimum vallue of the input array of integers ’array’ of size ’size’

34

Page 36: Filtrado de Im agenes y ecualizaci on de histograma - U-Cursos · EL7008 - Procesamiento Avanzado de Im agenes Tarea N 1 Filtrado de Im agenes y ecualizaci on de histograma Profesor:

EL7008 - Procesamiento Avanzado de Imagenes

56 */

57 int getMin(int array[], int size)

58 {

59 int min = 0;

60 for(int i = 0; i < size; i++)

61 if(array[i] < min)

62 min = array[i];

63 return min;

64 }

6566 int main(void)

67 {

68 /* Select image */

69 int imgNumber;

70 stringstream inputPath;

71 string imgName;

72 inputPath << "../../../ img/histeq/";

73 cout << "Select input image number: \n"

74 << "\t0 = mala_ilum.jpg \n"

75 << "\t1 = cochamo.png \n"

76 << "\t2 = mountains.png \n"

77 << "\t3 = chinese.jpg \n"

78 << "\t4 = bird.png \n"

79 << "\t5 = mribrain.jpg \n";

80 cin >> imgNumber;

81 switch(imgNumber){

82 case 0: imgName = "mala_ilum.jpg"; break;

83 case 1: imgName = "cochamo.png"; break;

84 case 2: imgName = "mountains.png"; break;

85 case 3: imgName = "chinese.jpg"; break;

86 case 4: imgName = "bird.png"; break;

87 case 5: imgName = "mribrain.jpg"; break;

88 default: imgName = "mala_ilum.jpg"; cout << "Using default image:" << imgName <<

endl;

89 }

90 inputPath << imgName;

91 Mat originalRGB = imread(inputPath.str()); //Leer imagen

92 if(originalRGB.empty ()) // No encontro la imagen

93 {

94 cout << "Imagen no encontrada" << endl;

95 return 1;

96 }

97 Mat original;

98 cvtColor(originalRGB , original , CV_BGR2GRAY);

99 Mat output = Mat:: zeros(original.rows , original.cols , CV_8UC1);

100101 ecualizar(original , output);

102 imshow("Ecualizado", output); // Mostrar imagen

103104 stringstream outPath;

105 outPath << "../../../ out/histeq/" << "histeq_"<< imgName;

106 imwrite(outPath.str(), output); // Grabar imagen

107108 cvWaitKey (0); // Pausa , permite procesamiento interno de OpenCV

109110 return 0; // Sale del programa normalmente

111 }

35