2.14 Descripci n de Formas y Contornos
-
Upload
cesar-vazquez -
Category
Documents
-
view
41 -
download
3
description
Transcript of 2.14 Descripci n de Formas y Contornos
-
DESCRIPCIN DE FORMAS Y CONTORNOS
Luis Enrique Coronado Zuiga
Facultad de Ingeniera
UASLP
1
-
INTRODUCCIN
Descripcin de una imagen: extraer propiedades o atributos de un objeto para su uso en aplicaciones.
Los descriptores deben ser deben:
Ser independientes del tamao, la localizacin y orientacin del objeto.
Contener suficiente informacin de discriminacin para distinguir un objeto de otro.
Descriptores de borde: rectas, curvas, etc.
Descriptores de regiones: color, textura, nivel medio de intensidad etc.
2
-
ESQUEMAS DE REPRESENTACIN
Las tcnicas de segmentacin producen datos en bruto en forma de pixeles de contorno o de una regin.
Normalmente se utilizan esquemas que compacten los datos en representaciones ms tiles en el clculo de descriptores.
Esquemas de representacin comunes:
Cdigos cadena
Aproximaciones poligonales
3
-
CDIGOS CADENA
Los cdigos cadena se utilizan para representar un contorno por medio de una secesin conexa de segmentos de longitud y direccin especificadas.
Normalmente se basa en segmentos de conectividad 4 u 8.
La direccin de cada segmento se codifica utilizando un esquema de numeracin.
Los cdigos cadena se crean siguiendo un contorno en una direccin (ej. en sentido de la manecillas del reloj)
4
-
CDIGOS CADENA
5 Conectividad 4 Conectividad 8
-
CDIGOS CADENA
Regularmente para generar cdigos cadena se vuelve a muestrear el contorno seleccionando un espacio de cuadricula mayor.
Se asigna un punto del contorno a cada nodo del cuadriculado.
6
-
CDIGOS CADENA
Se recorre el contorno, asignndole su cdigo cadena correspondiente.
7
Conectividad 4 Conectividad 8
-
APROXIMACIONES POLIGONALES
El objetivo de una aproximacin poligonal es captar la esencia de la forma del contorno con un polgono del menor nmero de lados posibles.
8
-
APROXIMACIONES POLIGONALES
Mtodo para dividir los lados de un contorno de Douglas-Peucker (DP):
Se encuentran los dos puntos extremos del borde y se crea una lnea que los conecta.
Se busca el punto del contorno ms alejado de la lnea creada en el paso anterior.
9
-
APROXIMACIONES POLIGONALES
El punto encontrado en el paso anterior se aade a la aproximacin poligonal
El proceso se repite hasta que la distancia ms alejada de las lneas de la aproximacin poligonal al contorno sea menor a una constante.
10
-
CONTORNOS EN OPENCV
OpenCV cuenta con una funcin para encontrar los contornos de una imagen.
Sin embargo antes de utilizarla se debe conocer lo siguiente:
Direccionamiento de memoria dinmica en OpenCV
Secuencias en OpenCV
11
-
DIRECCIONAMIENTO DE MEMORIA DINMICA EN OPENCV
OpenCV utiliza la estructura CvMemStorage para almacenar memoria de objetos dinmicos.
Para crear un nueva memoria CvMemStorage se utiliza el mtodo cvCreateMemStorage().
CvMemStorage* cvCreateMemStorage( int block_size =
0);
block_size indica el tamao de los bloque de memoria.
Si es puesto en 0, el tamao del bloque ser de 64kB.
Para liberar la memoria de un objeto CvMemStorage, se utiliza el siguiente mtodo:
void cvReleaseMemStorage(CvMemStorage ** storage);
12
-
SECUENCIAS:
Las secuencias son listas doblemente enlazadas de diferentes tipos de objetos utilizados por funciones de OpenCV.
Algunos elementos de la estructura que representa las secuencias en OpenCV son las siguientes.
typedef struct CvSeq {
CvSeq* h_prev; // secuencia previa
CvSeq* h_next; // prxima secuencia
CvSeq* v_prev; // segunda secuencia previa
CvSeq* v_next; // segunda secuencia prxima
int total; // nmero de elementos en la
secuencia
} 13
-
ENCONTRAR CONTORNOS EN OPENCV
Un contorno es una lista de puntos que representan una curva en una imagen.
La funcin cvFindContours() calcula los contornos de imgenes binarias.
Utiliza imgenes creadas por algn algoritmo de deteccin de bordes o por regiones creadas por funciones como cvThreshold() .
El resultado es una secuencia del tipo CvSeq que contiene los contornos encontrados.
Cada contorno encontrado es la vez una secuencia del tipo CvSeq que contiene los puntos del contorno encontrado
14
-
ENCONTRAR CONTORNOS EN OPENCV
cvFindContours() distingue entre dos tipos de contornos exteriores (c) y contornos interiores o huecos (h).
15
-
ENCONTRAR CONTORNOS EN OPENCV
int cvFindContours(
IplImage * img, (1)
CvMemStorage* storage, (2)
CvSeq** firstCountour, (3)
int headerSize, (4)
CvContourRetrievalMode mode; (5)
CvChainApproxMethod method; (6)
);
1. Imagen de entrada de 8 bits y un canal. Esta imagen tambin es usada como salida.
2. Memoria del tipo CvMemStorage.
16
-
ENCONTRAR CONTORNOS EN OPENCV
3. Puntero a una secuencia CvSeq . Se puede inicializar como nula una secuencia y despus utilizarse en la funcin como en el siguiente ejemplo:
CvSeq* firstContour = NULL;
cvFindContours( ..., &firstContour, ... );
4. Depende del valor del ltimo argumento method y puede tener el valor de sizeof(CvContour) o sizeof(CvChain) (solo cuando el mtodo de representacin es CV_CHAIN_CODE).
17
-
ENCONTRAR CONTORNOS EN OPENCV
5. Existen cuatro topologas posibles:
CV_RETR_EXTERNAL : Recupera nicamente los contornos exteriores
18
-
ENCONTRAR CONTORNOS EN OPENCV
CV_RETR_LIST : Recupera todos los contornos y los pone en una lista.
19
-
ENCONTRAR CONTORNOS EN OPENCV
CV_RETR_CCOMP : Recupera todos los contornos y los organiza en una jerarqua de dos niveles.
20
-
ENCONTRAR CONTORNOS EN OPENCV
CV_RETR_TREE : Recupera todos los contornos y reconstruye la jerarqua de los contornos anidados por niveles
21
-
ENCONTRAR CONTORNOS EN OPENCV
6. Define el mtodo de cmo los contornos son representados.
CV_CHAIN_CODE: los contornos se representarn en cdigo cadena.
CV_CHAIN_APPROX_NONE: se traducen todas las partes del cdigo cadena a puntos.
El valor de retorno de cvFindContours() es el nmero total de los contornos encontrados.
22
-
DIBUJAR CONTORNOS
void cvDrawContours(
CvArr* img, //Imagen de salida
CvSeq* contour, //Contornos
CvScalar external_color, //Color de contornos
CvScalar hole_color, //Color de huecos
int max_level, //Nivel del rbol
int thickness = 1, //Delgadez del contorno
int line_type = 8, //Tipo de lnea
CvPoint offset = cvPoint(0,0)
);
23
-
ENCONTRAR CONTORNOS EN OPENCV
Ejemplo: Cvseq* contornos = 0;
CvMemStorage* storage = cvCreateMemStorage(0);
cvFindContours( imagen_gris, storage, &contornos,
sizeof(CvContour), CV_RETR_TREE,
CV_CHAIN_CODE, cvPoint(0,0) );
cvDrawContours( imagen_color, contornos,
CV_RGB(255,0,0),
CV_RGB(0,255,0),1, 2, 2,
cvPoint(0,0) );
cvReleaseMemStorage( &storage );
24
-
APROXIMACIONES POLIGONALES EN OPENCV
CvSeq* cvApproxPoly(
const void* src_seq, //Contorno CvSeq
int header_size, //Tamao
CvMemStorage* storage, // Memoria dinmica
int method, //Mtodo de aproximacin
double parameter1, //Precisin
int recursive = 1
);
Ejemplo:
contornos = cvApproxPoly( contornos,
sizeof(CvContour), storage,
CV_POLY_APPROX_DP, 3, 1 );
25
-
DESCRIPTORES DEL CONTORNO.
Permetro: nmero de pixeles a lo largo del contorno. La distancia entre pixeles en diagonal se suele tomar como
2 1,4142
Ejemplo en OpenCV:
int p = cvContourPerimeter(contorno);
26
-
DESCRIPTORES DEL CONTORNO: PERMETRO
rea: nmero de pixeles dentro de un contorno. , = 1 si el pixel forma parte del objeto.
, = 0 si el pixel forma parte del fondo.
El rea es el nmero de pixeles para los cuales , = 1 , es decir:
= (, )
=1
=1
Ejemplo en OpenCV: int a = cvContourArea(contorno, CV_WHOLE_SEQ);
// CV_WHOLE_SEQ indica que se toma el contorno
de principio a fin. 27
-
DESCRIPTORES DEL CONTORNO: PERMETRO
Obtener una regin rectangular que encierre un contorno:
CvRect cvBoundingRect(
CvSeq* contour, //Secuencia de contornos
int update = 0
);
28
-
EJEMPLO:
CvSeq* contornos = 0;
CvMemStorage* storage = cvCreateMemStorage(0);
cvFindContours( imagen_binaria, storage, &contornos,
sizeof(CvContour), CV_RETR_TREE,
CV_CHAIN_APPROX_NONE, cvPoint(0,0)
);
// Los descriptores anteriores solo funcionan con
CV_CHAIN_APPROX_NONE
for( CvSeq* c = contornos; c != 0; c = c->h_next )
{
int p = cvContourPerimeter(c);
printf("Permetro: %i\n ", p );
}
cvReleaseMemStorage( &storage );
29
-
MOMENTOS:
Las formas de los lados de los contornos (y de las firmas) se pueden describir cuantitativamente utilizando momentos.
Un momento es un valor escalar calculado a partir de una imagen, que no variarn aunque el objeto aparezca en distinta posicin, rotado o con distinto tamao, siempre que sea el mismo objeto.
tiles para el reconocimiento de objetos por su forma.
En la prctica debido al ruido, estos valores no sern exactamente iguales.
No funcionan con objetos solapados o con varios objetos a la vez (se deben separar los objetos a reconocer). 30
-
MOMENTOS:
Hallar el centro de masa del sistema lineal siguiente:
31
= =1
=1
=
-
MOMENTOS:
Hallar el centro de masa de un sistema de masas puntuales.
32
=
=
=
=
-
MOMENTOS:
Momentos de Orden 0 (): Suma todos los pxeles cuyo valor es uno. Calcula el rea de una imagen.
00 = = (, )
=1
=1
Momento de Orden 1 ( y ): Momentos respecto al eje x (10), y respecto al eje y (01).
10 = (, )
=1
=1
01 = (, )
=1
=1
33
-
MOMENTOS:
Las coordenadas (X,Y) del centroide o centro de masa son:
= 1000
= 0100
Los momentos centrales se usan para reconocer una imagen independientemente de su situacin respecto a los ejes de coordenadas.
A partir de los momentos centrales se pueden construir un conjunto de siete momentos invariantes al cambio de escala, simetra y rotacin llamados momentos Hu.
34
-
MOMENTOS EN OPENCV
La funcin que utiliza OpenCV para calcular los momentos de un contorno es:
void cvContoursMoments(
CvSeq* contour, //contorno
CvMoments* moments //momentos
);
Obtener momentos cartesianos:
double cvGetSpatialMoment(
CvMoments* moments, //momentos
int x_order, //orden en x
int y_order //orden en y
);
35
-
MOMENTOS EN OPENCV
Ejemplo:
CvMoments moments;
for( CvSeq* c = contornos; c != 0; c = c-
>h_next )
{
cvMoments(c, &moments);
M00 = cvGetSpatialMoment(&moments,0,0);
M10 = cvGetSpatialMoment(&moments,1,0);
M01 = cvGetSpatialMoment(&moments,0,1);
int x = (int)(M10/M00);
int y = (int)(M01/M00);
}
36
-
EJERCICIO
Detectar el centro de masa de al menos 2 LEDs mediante resta de imgenes y momentos.
Tomar una imagen con los LEDs prendidos y otra con los LEDs apagados.
Eliminar ruido, segmentar la regin creada por la resta, rellenar huecos.
Obtener sus contornos
Obtener el centro de masa de los LEDs
Dibujar un crculo por cada LED. El centro de cada crculo debe ser el centro de masa de cada LED.
37
-
MOMENTOS EN OPENCV
Los momentos Hu son invariantes a la traslacin, rotacin y cambio de escala.
38
-
MOMENTOS EN OPENCV
Ejemplo obtener momentos Hu:
CvMoments moments;
-------------------------------
cvMoments(c, &moments);
CvHuMoments hu_moments;
cvGetHuMoments(&moments, &hu_moments);
printf(Momento Hu 1 = %f
",hu_moments.hu1);
39
-
LA TRANSFORMADA DE HOUGH
La Transformada de Hough es una tcnica usada para la deteccin de figuras o primitivas geomtricas en imgenes digitales (binaria o en escala de grises) .
Las figuras que deseamos encontrar se describen mediante ecuaciones paramtricas.
40
-
LA TRANSFORMADA DE HOUGH
La imagen de entrada pude ser, por ejemplo, una imagen con bordes extrados mediante el operador de Canny.
Espacio de parmetros: El conjunto de todas las combinaciones de los valores de parmetros de la ecuacin de la primitiva a buscar.
El espacio de parmetros debe ser discretizado para acortar la bsqueda a un conjunto finito de parmetros.
Entre ms parmetros consideremos, mayor ser la precisin y la operacin ser ms costosa.
41
-
LA TRANSFORMADA DE HOUGH
Encontrar lneas:
La transformada de Hough encuentra puntos en la imagen que satisfagan la ecuacin de la recta en su forma polar, para distintos valores de y .
Ecuacin polar de la recta: + =
El espacio de parmetros se discretiza en una serie de celdas denominadas celda de acumulacin.
42
-
LA TRANSFORMADA DE HOUGH
Cada pixel de la imagen votar por todas las ecuaciones correspondientes a primitivas a las que permanezca dicho punto recorriendo todas las combinaciones de parmetros de el espacio de bsqueda.
Las primitivas con un valor de votos mayor a un umbral sern reconocidas como lneas.
43
-
LA TRANSFORMADA DE HOUGH
Transformada de Hough para el crculo:
Se utiliza la siguiente ecuacin paramtrica: ( )2+( )2= 2
(a,b) es el centro del circulo, r es su radio.
La bsqueda es tridimensional y por lo tanto ms compleja que con lneas.
44
-
LA TRANSFORMADA DE HOUGH
Ventajas
Cada pxel de la imagen se procesa de modo independiente, lo que facilita su implementacin en paralelo.
La transformada "general de Hough es til para la deteccin de formas complejas
Es capaz de reconocer patrones ligeramente deformados, ocultos o discontinuos
Robusta frente al ruido
Inconvenientes
Tiempo y memoria
Ajustar el nivel de umbral de votos depende del problema.
45
-
EJERCICIO
Investigar como se realiza la transformada de Hough para encontrar lneas en OpenCV.
Realizar un programa que obtenga las lneas de una imagen.
Realizar un programa que obtenga las crculos de una imagen.
46