Está en la página 1de 5

1

INFORME DE TALLER 2: TRATAMIENTO Y


PRE-PROCESAMIENTO CON FILTROS
ESPACIALES DE IMÁGENES DIGITALES
Diego Alexander Rodríguez Vargas, diarodriguezva@unal.edu.co, código: 285607
Julián Alexander Vargas Jiménez, juavargasji@unal.edu.co, código: 285615

Resumen—El documento en cuestión corresponde al Informe


del Taller #2 de la materia Técnicas de Inteligencia Artificial,
para la carrera de Ingeniería Mecatrónica de la Universidad
Nacional de Colombia. El informe describe de manera concisa
las prácticas realizadas sobre tratamiento y pre-procesamiento
de imágenes digitales con filtros espaciales, además de incluir
el correspondiente análisis de los resultados obtenidos. Todas
las tareas aplicadas sobre las distintas imágenes utilizadas en el
taller, fueron realizadas con funciones de la librería OpenCV.
Figura 1. Máscaras 3x3 del filtro Prewitt Direccional
Palabras Claves—Imagen digital, pre-procesamiento de imáge-
nes, tratamiento de imágenes, filtro espacial, realce, suavizado,
detección de bordes, contornos, filtro Prewitt, filtro Canny, filtro en código C++, utilizando las distintas funciones de OpenCV.
Sobel.
La función se implementó como una función perteneciente al
API de OpenCV, de manera que puede ser llamada de forma
I. I NTRODUCCIÓN genérica. El código de la función se ilustra en la figura 2.
L documento en cuestión corresponde al Informe del
E Taller #2 de Técnicas de Inteligencia Artificial. Las
actividades del taller a desarrollar fueron:
1. Una función típica de la API de la librería de OpenCV
que permita aplicar un filtro Prewitt direccional (o de
ocho direcciones) a una imagen 2D, con el fin de detectar
los bordes de la misma en todas las direcciones (como
parte del aprendizaje de técnicas de pre-procesamiento de
imágenes con filtros espaciales).
2. Aplicación de distintas funciones de tratamiento y pre
- procesamiento de imágenes digitales, como el re-
dimensionado de una imagen (tratamiento), ó la detección
de bordes (ó contornos) de una imagen con un filtro
espacial derivativo (pre-procesamiento).
Se pretende realizar un análisis de los resultados obteni- Figura 2. Código fuente en C++ del filtro Prewitt direccional
dos, con el fin de efectuar una evaluación a cada una de
La estructura general de llamado a la función es la siguiente:
las funciones aplicadas y desarrolladas durante la práctica.
cvDirPrewitt(const CvArr *src, CvArr *dst, int_imgs[]);
II. D ESARROLLO DEL TALLER
II-A. Implementación del Filtro Prewitt Direccional Siendo en este caso:
El filtro Prewitt consiste en ocho máscaras que tienen src: argumento de tipo const CvArr; representa a la
como propósito el realce en ocho direcciones principales, imagen fuente, a la cual se le aplica el filtro Prewitt.
que son incrementales a 45° y recorren la imagen (mediante dst: argumento de tipo CvArr; corresponde a la imagen
convolución) las ocho direcciones cardinales principales (N, destino, es decir la imagen filtrada.
NO, O, SO, S, SE, E); esta es la principal ventaja del filtro, int_imgs[]: es un vector de ocho imágenes, en el cual
ya que permite determinar contornos en múltiples direcciones, se almacenan las ocho imágenes resultantes de aplicar
lo que en general proporciona un contorno bien definido de un filtro con cada una las ocho máscaras, de manera
la imagen. Las ocho máscaras del filtro Prewitt Direccional independiente.
se ilustran en la figura 1. La implementación de la función El procedimiento que efectúa la función del filtro Prewitt
que aplica el filtro Prewitt a una imagen digital se realizó es la siguiente:
2

1. Creación de las ocho máscaras direccionales del filtro II-B1. Umbralización Binaria: Esta método se define co-
mediante la función cvMat de OpenCV. Las máscaras se mo:
crean como matrices 3x3.
threshold_type=CV_THRESH_BINARY
2. Aplicación separada de cada máscara a la imagen fuente
mediante la función cvFilter2D de OpenCV. Esto no es dst(x,y) = max_value, si src(x,y)>threshold, 0 en caso
más que aplicar un filtrado espacial o convolución de la contrario.
imagen con cada máscara. Donde:
3. Finalmente se realiza una suma de las ocho imágenes dst es la imagen de destino.
filtradas (con las ocho máscaras direccionales) para con- src es la imagen fuente.
formar una sola imagen que tendrá como particularidad treshold es el valor de Umbralización.
un realce bien definido de los contornos de la imagen. max_value es el valor a asignar para los elementos que
Para este caso se utilizó como imagen fuente la figura 3; se hallen después del umbral.
esta imagen corresponde a un logotipo de la marca Puma, el La llamada a la función para aplicar la umbralización binaria
cual será usado en el desarrollo del proyecto final del curso. En se realizó como se muestra a continuación:
el código de C++ se realizó primero una reducción de espacio
de color RGB a escala de grises de la imagen, y luego se
procedió a llamar la función implementada cvDirPrewitt. El cvThreshold(src2_img,thres_img,100,255,CV_THRESH_BINARY);
resultado obtenido se tiene en la figura 4. El resultado se muestra en la figura 5.

Figura 3. Imagen original para probar el filtro Prewitt implementado

Figura 5. Ejemplo de umbralización binaria

II-B2. Umbralización Binaria Invertida: El método en


cuestión se define como:
threshold_type=CV_THRESH_BINARY_INV
dst(x,y) = 0, si src(x,y)>threshold max_value en caso
contrario.
Figura 4. Imagen filtrada con Prewitt implementado El resultado obtenido con este método se muestra en la figura
6. Observe que efectivamente esta umbralización es invierte
Observe que en la imagen filtrada efectivamente se definieron
los niveles de gris para caso de la umbralización normal
correctamente los contornos. Esto es un buen indicador de que
(comparar figura 5 con figura 6). Los valores de umbral y
el filtro Prewitt puede jugar un papel importante en la etapa
máximo valor son los mismos que para la umbralización
de pre-procesamiento de una sistema de visión de máquina,
binaria.
ya que puede facilitar el trabajo de segmentación.

II-B. Métodos de Umbralización


Son procesos que permiten redistribuir los componentes en
escala de grises de una imagen de a acuerdo a un determinado
nivel denominado umbral. Con esto se logran eliminar pixeles
o regiones de pixeles no deseados en una imagen. Cabe
resaltar que la umbralización tiene una fuerte conexión con
el histograma de una imagen, por lo que es preciso conocer Figura 6. Ejemplo de umbralización binaria invertida
previamente el histograma para determinar la forma más
apropiada de aplicar el umbral. II-B3. Umbralización Truncada: Este método se define
A continuación se describe la utilización de cada uno de como:
los métodos de umbralización, aplicados sobre la figura 10. threshold_type=CV_THRESH_TRUNC
La función que realizan la umbralización es: dst(x,y) = threshold, si src(x,y)>threshold o =src(x,y) en caso
cvThreshold contrario.
3

El resultado obtenido con este método se muestra en la figura espacios de color se ilustran a continuación al aplicar las
7. Los valores de umbral y máximo valor son los mismos que transformaciones sobre la figura 10.
para la umbralización binaria.

Figura 10. Imagen original para realizar las transformaciones de color


Figura 7. Ejemplo de umbralización truncada
II-C1. Conversión RGB a escala de gris: En este caso el
II-B4. Umbralización con Retorno a cero: El método se parámetro TipodeConversión es igual a CV_RGB2GRAY, con
define como: lo cual se logra una conversión a escala de grises de la imagen
de la figura 10. El código es el siguiente:
threshold_type=CV_THRESH_TOZERO
dst(x,y) = src(x,y), si (x,y)>threshold 0 en caso contrario src2_img=cvLoadImage("mano_or.jpg",1);
trans_img=cvCreateImage(cvGetSize(src2_img),
El resultado obtenido con este método se muestra en la
src2_img->depth, 1);
figura 8. Los valores de umbral y máximo valor son los
cvCvtColor(src2_img,trans_img,CV_RGB2GRAY);
mismos que para la umbralización binaria.
La imagen obtenida no es más que una imagen en gris,
según se ve en la figura 11. Observe que la imagen destino
es creada con un sólo canal, mientras que la imagen original
posee tres canales (espacio RGB).

Figura 8. Ejemplo de umbralización a cero

II-B5. Umbralización con Retorno a cero invertida: El


resultado obtenido con este método se muestra en la figura 9.
Los valores de umbral y máximo valor son los mismos que
Figura 11. Imagen transformada a escala de grises
para la umbralización binaria.
II-C2. Conversión RGB a espacio HSV: El modelo de
color HSV define el color de una imagen basada en tres
parámetros:
Matiz (Hue).
Saturación (Saturation).
Valor (Value).
El HSV es una transformación no lineal del espacio RGB,
y permite elegir en algunas aplicaciones fácilmente el color
mediante el parámetro Value. OpenCV permite realizar esta
Figura 9. Ejemplo de umbralización a cero invertida transformación al escoger el parámetro TipodeConversión de
la función cvCvtColor como CV_RGB2HSV. Al aplicar esto
II-C. Conversión de Espacios de Color a figura 10, el resultado fue la figura 12.

En esta sección se analizan los cambios a espacio de color


de una imagen en RGB, y se observará la posible utilidad
de las transformaciones. Para convertir a espacio de color se
emplea la función de openCV:
cvCvtColor(imagenFuente,imDestino,TipodeConversión);
El parámetro TipodeConversión permite escoger a que espa-
cio de color se transformará la imagen fuente. Estos distintos
4

Figura 12. Imagen transformada al espacio HSV II-D. Filtros Espaciales 2D para detección de contornos

Observe que una imagen en el espacio HSV permite diferen- II-D1. Filtro Laplaciano: La función que permite aplicar
ciar objetos y/o detalles que no son fácilmente visibles en el el filtro Laplaciano a una imagen es cvLaplace, la cual se
espacio RGB, de manera que puede ser utilizado como etapa muestra a continuación:
de pre-procesamiento para permitir una mejor segmentación
cvLaplace(const CvArr *img, CvArr *dst, int apertureSize=3)
de características diminutas.
II-C3. Conversión RGB a espacio HLS: El espacio HLS El filtro de laplace es básicamente un filtro derivativo de
es también una transformación no lineal del espacio RGB, con segundo orden que aplica el operador Laplaciano al nivel de
el cual se logra una representación en coordenadas cilíndricas gris de cada pixel de una imagen. Con esto se logra diferenciar
del mismo, al igual que el HSV. Se diferencia del HSV al los bordes de una imagen, ya que precisamente al derivar los
reemplazar el parámetro Value por Lightness o luminosidad del niveles de gris, en aquellos pixeles en que se encuentre un
color. La función cvCvtColor permite realizar la conversión al variación brusca del nivel de gris (entre pixeles vecinos), es
espacio HLS al escoger el parámetro TipodeConversión como en donde se encuentran casi siempre los contornos de un objeto
CV_RGB2HLS. El resultado se ilustra en la figura 13. en una imagen.
Al aplicar el filtro Laplaciano a la figura 3, se obtuvo el
resultado de la figura 16.

Figura 13. Imagen transformada al espacio HLS


Figura 16. Imagen filtrada con un filtro Laplaciano
II-C4. Conversión RGB a espacio LUV: La transforma- Observe que el comportamiento es similar al filtro Prewitt,
ción al espacio de color LUV (realmente CIELUV) se logra pero los contornos son más delgados. Esto desmuestra que el
en OpenCV al escoger el parámetro TipodeConversión de filtro Laplace es una buena alternativa para el proyecto del
la función cvCvtColor como CV_RGB2Luv. El resultado se curso, ya que puede diferenciar correctamente los contornos
ilustra en la figura 14. de un logotipo, y por ende puede facilitar la tarea de segmen-
tación.
II-D2. Filtro Canny: El filtro Canny es un filtro derivativo
similar al filtro Laplaciano, pero se diferencia en que las
derivadas direccionales en x e y son luego combinadas en
cuatro derivadas direccionales (se traduce en cuatro máscaras
direccionales). La detección de bordes, que en este caso es más
eficiente, se logra porque el filtro realiza una umbralización
por histéresis pixel a pixel, teniendo en cuenta el gradiente
del nivel de gris de cada pixel en las cuatro direcciones
Figura 14. Imagen transformada al espacio LUV mencionadas. Así se tienen dos umbrales, una alto y una bajo.
Si el gradiente del pixel esta por debajo del umbral bajo,
II-C5. Conversión RGB a espacio YCrCb: La transforma- este se descarta como parte del contorno; si esta por encima
ción al espacio de color YCrCb se logra en OpenCV al escoger del umbral alto, este se considera como parte del contorno.
el parámetro TipodeConversión de la función cvCvtColor Si el gradiente esta en el medio, solamente sera clasificado
como CV_RGB2YCrCb. El resultado se ilustra en la figura como parte del contorno si dicho pixel es vecino de un pixel
15. clasificado como parte del contorno.
La función que permite aplicar el filtro Canny a una imagen
es cvCanny, la cual se muestra a continuación:
cvCanny(const CvArr *img, CvArr *dst, double lowTresh,
double highTresh, int apertureSize=3)
donde los parámetros img y dst corresponde a las imagenes
fuente y destino respectivamente; los parámetros lowTresh y
highTresh corresponden a los unmbrales bajo y alto respectiva-
mente. El parámetro aperturesize indica el tamaño del kernel
Figura 15. Imagen transformada al espacio YCrCb o máscara en cada dirección, y por defecto es igual a 3.
5

Al aplicar este filtro a la imagen de la figura 3, se obtiene


la imagen de la figura 17. Para este caso se utilizó un umbral
bajo igual a 1 y un umbral alto igual 50, lo cual permite
diferenciar bien los contornos. Observe que al comparar con el
filtro Prewitt(ver figura 4), el filtro Canny entrega un borde mas
delgado y con menos artefactos, de manera que posiblemente
sea una mejor alternativa para la detección de bordes, y brinde
por ende mejores resultados al realizar una segmentación.

Figura 17. Imagen filtrada con un filtro Canny 50:1

III. C ONCLUSIONES
La práctica permitió tener una idea general de las funciones
de tratamiento y pre-procesamiento de una imagen, las cuales
pueden facilitar enormemente las tareas de segmentación y
aprendizaje (entre otras) de un sistema de visión de máquina.
Se comprendió totalmente que es esencial el uso de filtros
de detección de bordes para poder realizar luego un correcto
proceso de segmentación.

R EFERENCIAS
[1] G. Bradski, Learning OpenCV, O’Reilly, (2008)

También podría gustarte